我有一个表,其中有一列包含一个 bool 值,我在其中放置了一个复选框。我试图将一个命令绑定(bind)到该复选框,当我选中它时,它会在 View 模型中运行一个命令。我正在使用 MVVM 结构。这是我迄今为止所做的尝试。
<DataGrid
IsReadOnly="True"
Margin="0,10,0,0"
ItemsSource="{Binding Diary.Diaries}"
AutoGenerateColumns="False"
MinHeight="200"
SelectionMode="Single"
SelectionUnit="FullRow"
IsSynchronizedWithCurrentItem = "True"
>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Flagged">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid >
<CheckBox IsChecked="{Binding Flagged}" Command="{Binding Diary.FlagDiary}">
</CheckBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn >
<DataGridTextColumn Header="Diary ID" Binding="{Binding DiaryID}" />
</DataGrid.Columns>
</DataGrid>
这是 ViewModel 中的 RelayCommand。
FlagDiary = new RelayCommand(() =>
{
Debug.WriteLine("Test");
});
我无法让它运行 RelayCommand。知道我做错了什么吗?
最佳答案
复选框的 DataContext 将设置为 DataGrid 的 ItemSource 中的对象之一(Diary.Diaries 条目之一)。这使得命令绑定(bind)无效。
您需要进行相对源绑定(bind),以便可以访问 Diary.FlagDiary。这是执行此操作的一种方法(鉴于您上面发布的 xaml)。
<CheckBox IsChecked="{Binding Flagged}"
Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.Diary.FlagDiary}" />
一旦命令触发,您可能想知道该复选框用于哪个日记条目......对吧?为此,请将 CommandParameter 绑定(bind)添加到复选框。现在,绑定(bind)如下所示:
<CheckBox IsChecked="{Binding Flagged}"
Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.Diary.FlagDiary}"
CommandParameter="{Binding}" />
您的中继命令代码可能也需要更改。大概是这样的?
FlagDiary = new RelayCommand((parameter) =>
{
Debug.WriteLine(parameter.ToString());
});
关于c# - 将命令绑定(bind)到 DataGrid 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508468/