【问题标题】:Listview TwoWay Binding With ObservableCollectionListview 双向绑定与 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
  • 您的意思是列表视图最初显示您的数据,但后来当您添加矿石朋友时,它没有更新,是这样吗..?还是您的列表视图根本没有显示任何数据?

标签: wpf listview binding observablecollection


【解决方案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}}">
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 2015-11-08
        • 2012-05-26
        • 2018-05-21
        相关资源
        最近更新 更多