【问题标题】:WPF DataGrid ItemsSource doesn't get updated on changing sourceWPF DataGrid ItemsSource 不会在更改源时更新
【发布时间】:2012-06-22 07:21:19
【问题描述】:

我已经阅读了一些帖子,但没有人帮助我解决我的问题。 所以,我有一个带有 Viewmodel 的视图,并且在 View 内部有一个 DataGrid 绑定到 viewmodel 内的 ObservableCollection。 选定项也绑定到类型 T == ObservableCollection

public ObservableCollection<TableProperty> TableProperties
    {
        get
        {
            return tableProperties;
        }
        set
        {
            if (tableProperties != value)
            {
                tableProperties = value;
                OnPropertyChanged("TableProperties");
            }
        }
    }

public TableProperty Property
    {
        get
        {
            return property;
        }
        set
        {
            property = value;
            OnPropertyChanged("Property");
        }
    }

这里是 DataGrid:

<toolkit:DataGrid AutoGenerateColumns="False" 
                      UseLayoutRounding="True" 
                      ItemsSource="{Binding Path=TableProperties,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}"
                      SelectedItem="{Binding Path=Property,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
                      [...]>
        <toolkit:DataGrid.Columns>

现在我想实现一个逻辑,改变一个复选框触发一个命令设置所选项目的一些值:

<toolkit:DataGridTemplateColumn Header="Mandatory" IsReadOnly="False">
                <toolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <CheckBox IsChecked="{Binding Path=Mandatory,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                <CheckBox.Style>
                                    <Style TargetType="{x:Type CheckBox}">
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Path=MandatoryDB}" Value="True">
                                                <Setter Property="IsEnabled" Value="False" />
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding Path=MandatoryDB}" Value="False">
                                                <Setter Property="IsEnabled" Value="True" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </CheckBox.Style>
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="Checked">
                                        <cmd:EventToCommand Command="{Binding Path=DataContext.SetMandatory, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </CheckBox>
                        </StackPanel>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
            </toolkit:DataGridTemplateColumn>

这是它背后的命令:

 private void OnSetMandatory()
    {
        property.Visible = true;
        property.ReadOnly = false;
        property.VisibleInGrid = true;
        property.UIPropertyName = DateTime.Now.TimeOfDay.ToString();
        OnPropertyChanged("Property");
        OnPropertyChanged("TableProperties");
    }

问题是:当我更改属性时,集合内的项目也已更新,并且它在 Property Getter 中正常运行...... 如果我在视图中直接调用 Datagrid.Items.Refresh(),它也会正确显示值,但不会自动更新集合。

那么你有什么想法吗? :)

【问题讨论】:

    标签: wpf datagrid viewmodel observablecollection itemssource


    【解决方案1】:

    TableProperty 类必须实现 INotifyPropertyChanged 并正确提升它。

    【讨论】:

    • 啊,我已经正确实现了。非常感谢老兄! :)
    • @JohannesWanzek 似乎部分 cmets 已被删除,所以我只能看到您的满意,但看不到实际的正确实施...
    • 您好 Konrad,只需为您的类实现 INotifyPropertyChanged 接口即可。 stackoverflow.com/questions/1315621/…如果你有 Resharper,它会为你做的!
    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2018-06-28
    • 2011-10-26
    • 2010-11-09
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多