WPF将ObservableCollection绑定到ListBox

时间:2012-04-18 11:00:55

标签: .net wpf data-binding wpf-controls

我正在尝试将ObservableCollection绑定到ListBox。 调试输出没有显示任何绑定错误,但由于某种原因它不起作用。

XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:nwsfeed"
x:Class="nwsfeed.MainWindow"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
x:Name="Window">

    <ListBox x:Name="listBoxChannels" 
    ItemsSource="{Binding ElementName=Window, Path=App.ActiveProfile.Feeds}"
    DisplayMemberPath="Title"/>

</Window>

代码:

public partial class MainWindow : Window {
    public NwsfeedApp App { get; set; }
    // ..
}

public sealed class NwsfeedApp {
    public UserProfile ActiveProfile { get; set; }
    //..
}

public class UserProfile {
    private ObservableCollection<RSSFeed> feeds;
    public ObservableCollection<RSSFeed> Feeds { get { return feeds; } }
    //..
}

修改: 问题是,当我将ObservableCollection作为MainWindow的公共属性并且我像这样绑定它时,它可以工作:

ItemsSource="{Binding ElementName=Window, Path=Items, Mode=OneWay}" 

但是当我这样做时,它不会:

ItemsSource="{Binding ElementName=Window, Path=App.ActiveProfile.Feeds, Mode=OneWay}" 

EDIT2 我在App,ActiveProfile和Feeds属性中实现了INotifyPropertyChanged。 ListBox仍然没有反映集合的变化,除非我在其上调用.Items.Refresh()。

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:1)

在您的课程上实施INotifyPropertyChanged

答案 1 :(得分:0)

由于缺乏信息,这是一个黑暗的镜头:

您正在尝试访问App,这是一个静态应用程序属性,它不是窗口代码隐藏中的实例化变量。未评估绑定中其余的属性路径,因为无法找到App。

你可能想要这个:

ItemsSource="{x:Static local:App.ActiveProfile.Feeds}"

对于缺失的输出,请尝试Tools->Options->Debugging->Output window->WPF Trace Settings,您可以选择查看有关可用WPF曲线的更多或更少信息。

HTH,

巴布。