Кнопка привязки из пользовательского элемента управления к viewmodel не работает должным образом - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть MainWindow.xaml и MainWindowViewModel, у меня есть пользовательский Conterol внутри MainWindow.xaml, я хочу, когда пользователь нажимает кнопку управления пользователем, чтобы отправить это событие в MainWindowViewModel, у меня есть:

Внутри главного окна у меня есть:

 <Controls:UserControl1 CloseBtn="{Binding CloseBtn}" ></Controls:UserControl1>

UserControl1.xaml:

  <Button  Command="{Binding CloseBtn}" />

UserControl1.cs:

public static readonly DependencyProperty CloseProperty =
DependencyProperty.Register(
            "CloseBtn",
            typeof(ICommand),
            typeof(UserControl1),
            new PropertyMetadata(null));
public ICommand CloseBtn
{
   get { return (ICommand)GetValue(CloseProperty); }
   set { SetValue(CloseProperty, value); }
}

MainWindowViewModel.cs:

public ICommand CloseBtn { get; set; }
public MainWindowViewModel()
{
 CloseBtn = new RelayCommand(o => BtnCloseSettings());
}
void BtnCloseSettings()
{
   MessageBox.Show("test");
}

MainWindow и модель представления связаны, но при нажатии этой кнопки не появляется всплывающее окно «test» testBox.

что мне не хватает?

1 Ответ

0 голосов
/ 12 апреля 2020

Проблема в следующей строке:

<Button  Command="{Binding CloseBtn}" />

Вы создали свойство зависимостей в UserControl1, которое вы правильно связываете с этой строкой:

<Controls:UserControl1 CloseBtn="{Binding CloseBtn}" ></Controls:UserControl1>

Но это первое привязка - это привязка к свойству CloseBtn объекта DataContext UserControl. Вместо этого он должен привязаться к свойству зависимостей CloseBtn UserControl. Чтобы это исправить, начните с присвоения имени UserControl:

<UserControl x:Class="YourApp.UserControl1"
    ... etc ...
    x:Name="_this">

, а затем измените привязку команды кнопки, чтобы привязать ее к этому:

<Button Command="{Binding CloseBtn, ElementName=_this}" />

Или, как уже упоминалось в комментарии:

<Button Command="{Binding CloseBtn,
                  RelativeSource={RelativeSource AncestorType=UserControl}}" />

, где вам не нужно было бы присваивать свойство x:Name UserControl и, таким образом, избегать создания в противном случае неиспользуемого частного поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...