Listview 双向绑定与 ObservableCollection

Posted

技术标签:

【中文标题】Listview 双向绑定与 ObservableCollection【英文标题】:Listview TwoWay Binding With ObservableCollection 【发布时间】:2011-08-27 00:18:41 【问题描述】:

:::::::::: ObservableCollection :::::::::::

    ObservableCollection<Friend> Friends = new ObservableCollection<Friend> ( );

:::::::::: InitializeFriends :::::::::::

        private void InitializeFriends ( )
        
            JsonObject _JsonObject = Process . FacebookClient . Get ( "/me/friends" ) as JsonObject;

            if ( _JsonObject != null )
            
                JsonArray _JsonArray = _JsonObject [ "data" ] as JsonArray;
                foreach ( JsonObject Friend in _JsonArray )
                
                    Friends . Add ( new Friend ( )  Name = Friend [ "name" ] . ToString ( )  );
                
            
        

:::::::::: 朋友::::::::::

    public class Friend
    
        public string Name  get; set; 
        public Conversation Chat  get; set; 
        public BitmapImage Image  get; set; 
    

:::::::::: ListView :::::::::::

        <ListView Name="Panel"
              Width="Auto"
              Margin="0,200,0,0"
              HorizontalAlignment="Stretch"
              VerticalAlignment="Stretch"
              Background="x:Null"
              BorderThickness="0"
              ItemsSource="Binding Path=Friends,
                                    Mode=TwoWay"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled"
              SelectionMode="Single">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.View>
            <GridView ColumnHeaderContainerStyle="StaticResource hiddenStyle">
                <GridViewColumn Width="200" DisplayMemberBinding="Binding Path=Name" />
                <GridViewColumn Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Image Width="30"
                                       Height="30"
                                       Source="Binding Path=Image" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

未绑定的列表视图可能已绑定但未更新?!!! 出了点问题

【问题讨论】:

不绑定?所以朋友们根本没有出现?您希望它们何时更新? 当我执行 Friends.add(...) 时,我希望 LISTVIEW 能够动态更新 您可能会在我的博客上找到对调试绑定问题有用的帖子:rtroywest.wordpress.com/2011/03/02/debugging-xaml-bindings 您的意思是列表视图最初显示您的数据,但后来当您添加矿石朋友时,它没有更新,是这样吗..?还是您的列表视图根本没有显示任何数据? 【参考方案1】:

您的 Friend 类需要实现 INotifyPropertyChanged 接口,以便 WPF 在对该属性进行更改时通知。

【讨论】:

只有当他有兴趣看到特定朋友的变化时,这似乎不是问题。如果正确绑定 ObservableCollection 将显示 Friends 集合的更改,即使 Friend 类没有实现 INotifyPropertyChanged 谢谢。有同样的问题,但实现它解决了它并保持代码干净。【参考方案2】:

当您遇到 XAML 绑定问题时,首先要做的是在 Visual Studio 下运行您的程序,并在输出窗口中查看任何提及 XAML 或绑定的错误或警告。如果有问题,它可能会出现在那里。

您的输出窗口可以通过从主菜单中选择 View->Output(或键入 Ctrl+W、O)来打开。如果您没有看到任何内容,请在“显示输出自”组合框中选择“调试”。

如果您仍然没有看到任何内容,那么您可能需要更改 WPF 跟踪级别。您可以通过从主菜单中选择“调试”并选择“选项和设置...”来执行此操作。展开调试节点并选择“输出窗口”。现在在右侧窗格中,将“WPF 跟踪设置”中的“数据绑定”值设置为至少警告。下次在 VS 下运行应用程序时,您应该会在输出窗口中看到一些信息。

如果您仍然没有获得足够的信息,您可以通过将 System.Diagnostics 命名空间添加到您的 XAML 文件来更改 XAML 中的跟踪级别(在 .Net 3.5 及更高版本中):

 xmlns:diagnostics=”clr-namespace:System.Diagnostics;assembly=WindowsBase”

并在感兴趣的绑定中设置跟踪级别,如下所示:

<ListView Name="Panel"
      Width="Auto"
      Margin="0,200,0,0"
      HorizontalAlignment="Stretch"
      VerticalAlignment="Stretch"
      Background="x:Null"
      BorderThickness="0"
      ItemsSource="Binding Path=Friends,
                            Mode=TwoWay,   
                            diagnostics:PresentationTraceSources.TraceLevel=High"
      ScrollViewer.HorizontalScrollBarVisibility="Disabled"
      SelectionMode="Single">

【讨论】:

【参考方案3】:

您的Friends 集合需要公开为公共属性,即:

private readonly ObservableCollection<Friend> _friends = new ObservableCollection<Friend>();
public ObservableCollection<Friend> Friends  get  return _friends;  

【讨论】:

【参考方案4】:

如果您的数据上下文是正确的,您的绑定应该可以工作。顺便说一句,您只需要 Mode=OneWay

<ListView Name="Panel" ItemsSource="Binding Path=Friends, Mode=OneWay" />

所以你应该首先检查你的 DataContext。最简单的方法是使用Snoop。您还可以检查您的 Visual Studio 输出窗口以查看绑定错误

【讨论】:

将 Binding Path = Friends 更改为 Binding Friends ,没办法 :( 你检查你的数据上下文了吗? itemssource 的实例是否与您添加和删除新项目相同?【参考方案5】:

请将此属性添加到 XAML 窗口:

DataContext="Binding RelativeSource=RelativeSource Self">

【讨论】:

以上是关于Listview 双向绑定与 ObservableCollection的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin 表单中将 Observable 集合绑定到我的 ListView 时遇到问题

Xamarin Forms ListView 绑定到 Observable 集合中的子对象列表

Knockout双向绑定

字典到 ListView 双向绑定 - 可能吗?

更新绑定的 Observable 集合的一个元素

如何将 Dictionary<enum, bool> 双向绑定到 WPF 中的 ListView 列?