DataBinding问题 - DataTemplate / ViewModel / ICollectionView

时间:2011-07-25 08:04:22

标签: wpf 2-way-object-databinding

最初我把它发布到PRISM4论坛,但得到了我应该的建议 尝试这个论坛:)我正在使用WPF4 BTW ...

我正在运行PRISM4,我一直在努力让我的数据绑定工作。 我正在遵循MVVM模式并拥有最初加载的视图模型 来自RDBMS的数据并将其包装在ICollectionView中。这完美地工作,数据显示在绑定的DatGrid中,但是当我试图保持时,我正在努力工作 对在下面声明的DataGrid中显示的数据所做的更改。

视图模型通过读/写属性发布ICollectionView, “结果”,正如您所看到的那样具有“TwoWay”的绑定模式。我想 这足以坚持对状态的改变 复选框但没有:(我已经尝试了很多方法来实现 这个但复选框的状态不会传播回视图模型。 我拦截了对“PlotClicked”方法的调用,这是一个ICommand 对象,但传递的参数具有未更改的“Plot”属性! 当我单击其中一个列标题和。时,这一点尤为明显 视图已排序 - 未选中已选中的行,这是从数据库中检索时复选框的默认状态。

我在这里做错了什么?

非常感谢提前 - 我真的被困在这里:( /彼得

<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

    public ObservableCollection Results {get;组; }

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

                                         

  3. 在“列”部分

    中将以下代码添加到DataGrid
        <DataGridTemplateColumn
            Header="cbTest"
            x:Name="cbTest"
            CellTemplate="{StaticResource IsSelectedColumnTemplate}"
            CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
            CanUserSort="True"
            Width="Auto"
            />
    
  4. 在进行了这些更改之后,我在IsChecked中对UpdateSourceTrigger的各种设置进行了实验=“{Binding提到...在上面的(2)中没有效果。我对复选框所做的更改不会转移回视图-model的ObservableCollection。

    再一次,非常感谢你帮我解决这个问题!

    *更新 * 现在我已经经历了一些非常棒的事情:(这就是我所做的:

    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中的复选框列,“Plot属性”永远不能设置为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; }
        ...
    

    你可能会问的结果?它的工作原理和'Plot'设置正确!现在,我想,这很奇怪!所以我做的是以下(简单地注释掉私有var和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; }
        ...
    

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

2 个答案:

答案 0 :(得分:0)

不确定,但我建议您尝试使用ObservableCollection作为ItemsSource。我以前遇到过很多这样的问题,所有这些都是使用这种集合解决的(为了更新目的,它比经典集合更快,更少消耗)。

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

答案 1 :(得分:0)

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

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

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