【发布时间】:2016-05-30 17:35:58
【问题描述】:
问题
当在 DataGrid 中检查 Checkbox 时,我似乎无法在 ViewModel 中触发方法。
每一行在行内都有一个Checkbox,当Checkbox 被选中/取消选中时,我想在ViewModel 中触发一个方法来更新数据库。
代码
我的 XAML 中有这个 Datagrid:
<DataGrid x:Name="dg_chapters" ItemsSource="{Binding Chapters}" SelectedItem="{Binding Chapter}" SelectionMode="Single" Background="Transparent" BorderBrush="#e5e5e5" CellStyle="{StaticResource episodeDataGridCell}" RowHeaderWidth="0" GridLinesVisibility="None" HorizontalAlignment="Stretch" Grid.Row="4" VerticalAlignment="Stretch" AutoGenerateColumns="False" Grid.RowSpan="1" Grid.Column="1" Grid.ColumnSpan="7">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Description}" CanUserResize="False" ClipboardContentBinding="{x:Null}" Header="Chapter" Width="90"/>
<DataGridTextColumn Binding="{Binding Appearance}" CanUserResize="False" ClipboardContentBinding="{x:Null}" Header="Player" Width="90"/>
<DataGridTextColumn Binding="{Binding Channel}" CanUserResize="False" ClipboardContentBinding="{x:Null}" Header="Channel" Width="100"/>
<DataGridTextColumn Binding="{Binding Mode}" ClipboardContentBinding="{x:Null}" Header="Mode" Width="80"/>
<DataGridCheckBoxColumn Binding="{Binding Protected}" Header="Protected" Width="80"/>
</DataGrid.Columns>
</DataGrid>
您可以在底部看到我的Checkbox 专栏。在我的ViewModel 中,我尝试创建一个命令来处理Checkbox 的选择/取消选择:
public ICommand Protected
{
get { return new DelegateCommand<object>(Protected_Click); }
}
然后我创建了受保护的方法:
private void Protected_Click(object obj)
{
//DOES NOT HIT.
}
谁能看到我哪里出了问题以及如何让这个功能发挥作用?
【问题讨论】:
-
您正在尝试将命令绑定为 CheckBox 值,这是行不通的。来自 MSDN “要填充列,请使用 Binding 属性将列绑定到数据。Binding 属性是应用于列中创建的 CheckBox 元素。" msdn.microsoft.com/en-us/library/…
-
在你的虚拟机中创建一个属性 IsChecked,将它绑定到 CheckBox.IsCheked,然后在属性设置器中调用你的数据库更新方法
-
@Василий Шапенко 有没有办法可以传递复选框所在的行?
-
@Ben Clarke 您的 ViewModel 应该有足够的信息,row 只是某个模型的表示,您不需要它。只需编写一个带有 IsCheked 属性和虚拟方法 UpdateDb 的基本 ViewModel,您将在子模型中覆盖它。或者将方法 UpdateDb 设为 Func,如果您不想编写太多无用的(从我的角度来看)类
-
@ВасилийШапенко 我已经有了更新数据库的功能,并且我已经成功地添加了当复选框被选中时触发方法的属性。我只是坚持检索行信息。
标签: c# wpf checkbox mvvm datagrid