Listview与ObservableCollection的TwoWay绑定

时间:2011-05-17 07:09:43

标签: wpf listview binding observablecollection

:::::::::: 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>

列表视图不绑定可能绑定但不更新?!!!
有一些错误

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

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

enter image description here

如果您仍然没有获得足够的信息,可以通过将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">

答案 2 :(得分:1)

您的Friends收藏品需要作为公共财产公开,即:

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

答案 3 :(得分:0)

如果你的datacontext是正确的,你的绑定应该有效。顺便说一句,你只需要Mode = OneWay

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

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

答案 4 :(得分:0)

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

DataContext="{Binding RelativeSource={RelativeSource Self}}">