【问题标题】:Having trouble binding list/grid to collection无法将列表/网格绑定到集合
【发布时间】:2009-10-16 16:55:39
【问题描述】:

我已经设置了一个网格并将其绑定到一个集合。我可以通过我的网格编辑集合中的项目,并将更改传播到集合。而且,GUI 会在设置 ItemSource 时显示集合中的所有内容。但是,我正在以编程方式更改集合中的一些项目(在设置 ItemSource 之后),这些更改不会反映在网格/GUI 中。为了让它刷新,我还需要做些什么。仅供参考,对于我要编辑的字段(MoveToResource、ResourceKey 和资源类型),我已将模式设置为 TwoWay。下面是我的网格。

            <ListView Name="lstXAMLStrings" Margin="5"  Grid.Row="1">
            <ListView.View>                    
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Extract?">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox Content="" IsChecked="{Binding Path=MoveToResource, Mode=TwoWay}"  ></CheckBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Text">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <local:RichTextBlock RichText="{Binding Path=FormattedMatchedLines}"  TextWrapping="Wrap"  Width="650"></local:RichTextBlock>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Key Name">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding Path=ResourceKey, Mode=TwoWay}" Width="150"></TextBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Resource Type">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <ComboBox ItemsSource="{Binding Source={StaticResource odp}}" SelectedItem="{Binding Path=Resource, Mode=TwoWay}"></ComboBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>                   
            </ListView.View>
        </ListView>

【问题讨论】:

    标签: c# wpf data-binding collections


    【解决方案1】:

    您的 [view]model 类是否实现 INotifyPropertyChanged 并在使用属性集访问器时触发事件?

    【讨论】:

      【解决方案2】:

      您需要确保要绑定数据的集合本身是可观察的集合(实现 INotifyCollectionChanged 接口的类)。您可能也可以推出自己的实现 INotifyCollectionChanged 的​​类,但这是 ObservableCollection 存在的唯一原因,因此它可以为您节省一些时间。

      有一个msdn article 告诉你怎么做。

      【讨论】:

      • Joseph:这只会确保从集合中添加/删除元素会更新视图。它对更改集合的一个元素内的属性没有影响。集合包含的类需要实现 INotifyPropertyChanged 才能工作...
      • @Reed 谢谢,我误读了我认为他正在以编程方式从他的收藏中添加/删除项目的问题。
      【解决方案3】:

      您需要确保您的收藏品实现INotifyPropertyChanged

      如果您以编程方式(正确)更改的每个项目都实现了这一点,那么您的 ListView/GridView 将保持最新状态。

      如果您以编程方式或在另一个屏幕中修改您的收藏项,这将起作用。

      【讨论】:

      • 这就是我所缺少的。谢谢。
      • 好的,现在我实现了 INotifyPropertyChanged,项目会在以编程方式更改时更新。但是现在通过 GUI 所做的更改不会传播到集合项。有什么办法可以做到这两点?
      • Brandon:只要一切都正确实施,它应该可以双向工作。你能展示你的集合实现吗?
      • Brandon:INotifyPropertyChanged 实现根本不应该将绑定更改为集合 - 这应该完全相同。
      • @Brandon,您应该在绑定标签内使用 TwoWay 绑定模式。
      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2011-06-28
      相关资源
      最近更新 更多