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 时遇到问题