最初我将此发布到 PRISM4 论坛,但有人建议我也应该尝试这个论坛:) 我正在使用 WPF4 BTW ...
我正在运行 PRISM4,我一直在努力让我的数据绑定工作。我遵循 MVVM 模式并有一个视图模型,它最初从 RDBMS 加载数据并将其包装在 ICollectionView 中。这非常有效,数据显示在绑定的 DatGrid 中,但我在尝试持久化对下面声明的 DataGrid 中呈现的数据所做的更改。
视图模型通过读/写属性“Results”发布 ICollectionView,如您所见,该属性具有“TwoWay”的绑定模式。我认为这足以保持对复选框状态所做的更改,但没有:(我已经尝试了多种方法来实现这一点,但复选框的状态不会传播回视图模型。我'我截获了对“PlotClicked”方法的调用,该方法是一个 ICommand 对象,但传递的参数具有未更改的“Plot”属性!当我单击其中一个列标题并对视图进行排序时,这一点尤其明显 - 选中的行是未选中,这是从数据库检索时复选框的默认状态。
我在这里做错了什么?
非常感谢 - 我真的被困在这里:( /Peter
<DataGrid Grid.Row="0" Name="gridResults" ItemsSource="{Binding Results,Mode=TwoWay}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Plot">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Plot, Mode=TwoWay}"
HorizontalAlignment="Center"
Command="{Binding Path=DataContext.PlotClicked,Mode=OneWay, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
我尝试了向我指出的建议。这就是我所做的:
在视图模型中,我将 Result 属性从 ICollectionView 更改为 OC
公共 ObservableCollection 结果 { 获取;放; }
为构成视图的 UserControl 添加了以下模板资源
将以下代码添加到“列”部分的 DataGrid
<DataGridTemplateColumn Header="cbTest" x:Name="cbTest" CellTemplate="{StaticResource IsSelectedColumnTemplate}" CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}" CanUserSort="True" Width="Auto" />
在进行了这些更改后,我在上面 (2) 中的 IsChecked="{Binding 中提到了 ... .
再次,非常感谢您在这里帮助我!
*更新* 现在我经历了一些非常可怕的事情:(这就是我所做的:
public class ResultViewResult : IReslutViewResult
{
public bool Plot { get; set; }
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
这在某种意义上是行不通的,即通过单击 DataGrid 中的复选框列永远无法将“绘图属性”设置为 true!现在我做了以下事情:
public class ResultViewResult : IReslutViewResult
{
private bool _plot;
public bool Plot
{
get
{
return _plot;
}
set
{
_plot = value;
}
}
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
你可能会问结果?它有效,并且“绘图”设置正确!现在,我想,这很奇怪!所以我所做的是以下(简单地注释掉私有变量和获取/设置代码):
public class ResultViewResult : IReslutViewResult
{
public bool Plot { get; set; }
//private bool _plot = false;
//public bool Plot
//{
// get
// {
// return _plot;
// }
// set
// {
// _plot = value;
// }
//}
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
好的,结果呢?有用!!!???我惊呆了……我的意思是第一个和最后一个有什么区别????我对此感到非常尴尬 - 我的意思是我想知道这里的幕后发生了什么...... :(