1

最初我将此发布到 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>

...

我尝试了向我指出的建议。这就是我所做的:

  1. 在视图模型中,我将 Result 属性从 ICollectionView 更改为 OC

    公共 ObservableCollection 结果 { 获取;放; }

  2. 为构成视图的 UserControl 添加了以下模板资源

  3. 将以下代码添加到“列”部分的 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; }
    ...

好的,结果呢?有用!!!???我惊呆了……我的意思是第一个和最后一个有什么区别????我对此感到非常尴尬 - 我的意思是我想知道这里的幕后发生了什么...... :(

4

2 回答 2

0

不确定这是否是您的问题,但 DataGrid 使用数据绑定的变体,在您移出该行之前不会将更改提交到源。这称为绑定组。也许您没有看到提交的值是因为您还没有离开该行?

http://blogs.msdn.com/b/vinsibal/archive/2008/08/11/wpf-3-5-sp1-feature-bindinggroups-with-item-level-validation.aspx

另一种可能性是绑定路径不正确?您是否检查过 VS 中的输出窗口以查看它是否报告任何绑定路径失败?

于 2011-07-25T13:26:24.597 回答
0

不确定,但我建议您尝试使用ObservableCollectionused as ItemsSource。我以前遇到过很多这样的问题,所有这些问题都使用这种集合解决了(顺便说一句,这比经典集合更快,消耗更少,用于刷新目的)。

另外,尝试在IsChecked绑定中添加以下内容:UpdateSourceTrigger=PropertyChanged,这可以解决问题,我认为这里唯一的问题是源没有在正确的时间更新!

于 2011-07-25T09:11:10.893 回答