我不想为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>
答案 0 :(得分:0)
我认为您必须阅读有关mvvm模式和ICommand接口的更多信息。 然后,您可以使用ToggleButton
<ToggleButton Command="{Binding MyCommand}"/>
在vm中:
public ICommand MyCommand => new RelayCommand(() => /* your method, for example cell adding *\);