Как привязать кнопку в пользовательском элементе управления к команде в родительском элементе управления?

#wpf #vb.net #xaml #binding

#wpf #vb.net #xaml #привязка

Вопрос:

У меня проблема с привязкой моего Button в UserControl к Command в родительском элементе.

У меня есть UserControl (SearchView), который отображает данные результатов поиска. Это содержит Menu , в который я хочу включить функцию, которая сбрасывает пользовательские настройки (размер шрифта, сортировку и т.д.). Поскольку таких существует несколько, я хочу иметь функцию сброса в родительском элементе управления (MainView).

MainViewXaml:

 <UserControl x:class="UI.MainView"
xmlns:ui="clr-namespace:Project.Main.UI">
//some stuff here
<ui:SearchView/>
//some stuff here
</UserControl>
  

MainView.xaml.vb:

 Namespace UI

Public Class MainView

Public ReadOnly Property ResetCommand As New DelegateCommand(AddressOf ResetEinstellungen)

Public Sub ResetEinstellungen()
      //Reset Einstellungen ...
End Sub
  

SearchView:

 <UserControl x:Class="UI.SearchView"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm">
<Grid>
//Table Stuff
</Grid>
<Menu>
    <MenueItem Header="Reset"
               x:Name="ResetButton">
          <dxmvvm:Interaction.Behaviors>
                    <dxmvvm:EventToCommand EventName="Click"
                                           Command="{Binding ResetCommand , RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl} }">
                    </dxmvvm:EventToCommand>
          </dxmvvm:Interaction.Behaviors>
     </MenuItem>
</Menu>
  

Я уже пробовал некоторые варианты.
Чего я хочу избежать, так это переименовать MainView по его имени элемента, поскольку я хочу потенциально использовать UserControl в других представлениях.

Ответ №1:

Я провел эксперимент.

Это работает для меня:

    <MenuItem Header="Reset"
              Command="{Binding DataContext.ResetCommand , RelativeSource={RelativeSource AncestorType=UserControl} }"/>
  

Примечание:

DataContext.CommandName

Вы можете использовать command в menuitem, а не eventtocommand.

Комментарии:

1. Итак, я уже был более или менее прав, но я все еще не могу заставить его выполнять мой метод, когда я нажимаю на него, что для меня странно. MainView находится в DialogWindow, который является частью ContainerControlledLifetimeManager, но находится рядом с этим в значительной степени barebone, поэтому на данный момент я действительно просто догадываюсь, в чем моя проблема. Я также ничего не получаю от отладчика, почему он не привязан или почему он не выполняется.

Ответ №2:

Попробуйте установить AncestorLevel на 2 , поскольку значение по умолчанию 1 будет привязываться к SearchView , а не к MainView :

 Command="{Binding ResetCommand , RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=2, AncestorType=UserControl} }