c# - 将命令绑定(bind)到 DataGrid 中的元素

标签 c# wpf mvvm datagrid

我有一个表,其中有一列包含一个 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/

相关文章:

c# - 为什么 StringComparison.InvariantCultureIgnoreCase 不适用于此 Db4o linq 查询?

c# - 在 C# 中保持大小写不变的情况下替换文本

c# - 反编译C#时出现"PrivateImplementationDetails"函数

wpf - WPF中的datagridview在哪里?

c# - 用户控件在运行时动态创建,但存在内存泄漏

wpf - 无法将 VM 中的类绑定(bind)到 WPF 中的 View

c# - 停止 Visual Studio 在 C# 中对我导入的接口(interface)成员进行排序?

wpf - 如何从 XAML 获取 ObservableCollection 中的项目数?

c# - 从用户控件访问父窗口的网格

c# - 使用 MVVM 如何从许多可视组件或选项更新标签?