wpf UserControl команда кнопка привязки щелчка - PullRequest
0 голосов
/ 01 мая 2018

У меня есть usercontrol:

<UserControl x:Class="MyApp.Header"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="40" d:DesignWidth="300" DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}">

   <Grid>
        <Label Content="{Binding LableContent, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"></Label>
        <Button Command="{Binding Path=AddClick, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">
            <Image Source="{StaticResource addImage}" Height="20"/>
        </Button>
    </Grid>
</UserControl>

И свойство зависимости в usercontoror:

public string LableContent
{
    get { return (string)GetValue(LableContentProperty); }
    set { SetValue(LableContentProperty, value); }
}
public static readonly DependencyProperty LableContentProperty =
    DependencyProperty.Register("LableContent", typeof(string), typeof(Header));

public ICommand AddClick
{
    get { return (ICommand)GetValue(AddClickProperty); }
    set { SetValue(AddClickProperty, value); }
}
public static readonly DependencyProperty AddClickProperty =
            DependencyProperty.Register("AddClick", typeof(ICommand), typeof(Header));

Я добавил usercontrol в главном окне:

<local:Header AddClick="{Binding Path=AddUser_Click}" LableContent="Users"></local:Header>

И добавить событие клика на MainWindow.cs

private void AddUser_Click(object sender, RoutedEventArgs e)
{

}

Проблема в том, что метка заполняется, но команда нажатия кнопки не вызывается. Что я делаю не так?

1 Ответ

0 голосов
/ 01 мая 2018

Есть две вещи, которые нужно установить

  1. Укажите DataContext для window.xaml и относительный источник для команды AddClick, чтобы AddUser_Click можно было найти в Window.

Обновите привязку Window.xaml AddClick до

<local:Header AddClick="{Binding Path=DataContext.AddUser_Click, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}" LableContent="Users"/>

и задайте для DataContext Window.xaml значение Window.xaml.cs, добавив его в конструктор MainWindow

this.DataContext = this;

Выполнение вышеуказанного шага обеспечит правильное определение свойства AddUser_Click.

  1. Все свойства зависимостей при связывании пытаются найти свойство в DataContext, а не в методе. Таким образом, команда должна быть свойством для window.cs типа ICommand, и ей должен быть предоставлен метод в конструкторе.

Для реализации этого большинство людей используют http://www.wpftutorial.net/delegatecommand.html. Просто скопируйте это в новый файл. В вашем MainWindow.xaml.cs добавьте это

AddUser_Click = new DelegateCommand(AddUserMethod);

Теперь вы можете добавить метод с именем AddUserMethod в тот же файл, и он будет вызываться всякий раз, когда вы нажимаете кнопку в пользовательском элементе управления !!

...