如何向控件绑定的对象发送事件?

时间:2019-03-24 18:54:46

标签: c# wpf xaml

我不想为xaml控件上的click事件创建处理程序,而是希望将处理程序实现到控件绑定到的对象的Class中。如果可能的话。

我正在WPF中进行“生命游戏”,我有一个Cell类,它的一个属性是Color,当另一个属性State更改时,Color被修改。状态可以是死的或活的。在MainWindow.xaml.cs中,我实例化了一个ObservableCollection of Cells。在MainWindow.xaml中,我有一个UniformGrid,该UniformGrid绑定到Cell的ObservableCollection,并且当Cell更改其状态时,UniformGrid中的Cell会更改其颜色。 我想做的是为DataGridCell上的Click事件创建一个处理程序,并且该处理程序应该在Cell类中实现,这样,绑定到被单击的DataGridCell的Cell将触发它自己的处理程序。

Cell类:

    public class Cell : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName){/*...*/}

        public void ChangeState(object sender, MouseButtonEventArgs e){/*...*/}

        private CellState state;
        public CellState State{/*...*/}
        private CellState nextState;
        public Color Color{/*...*/}

        /* Other irrelevant stuff */
    }

我一直在获取MainWindow不包含'ChangeState'的定义,我想以某种方式绕过它,因为我希望处理程序位于Cell类本身内。

MainWindow.xaml.cs:

    public MainWindow()
        {
            InitializeComponent();
            var vm = new ViewModel();

            for (int i = 0; i < 100; i++)
            {
                vm.Cells.Add(new Cell());

            DataContext = vm;
        }

MainWindow.xaml:

    <ItemsControl ItemsSource="{Binding Cells}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="10"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <DataGridCell BorderThickness="0.1" MouseUp="ChangeState">
                    <DataGridCell.Background>
                        <SolidColorBrush Color="{Binding Color}"/>
                    </DataGridCell.Background>
                </DataGridCell>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

1 个答案:

答案 0 :(得分:0)

我认为您必须阅读有关mvvm模式和ICommand接口的更多信息。 然后,您可以使用ToggleButton

<ToggleButton Command="{Binding MyCommand}"/>

在vm中:

public ICommand MyCommand => new RelayCommand(() => /* your method, for example cell adding *\);