将ObservableCollection绑定到ListView

时间:2012-07-21 22:43:13

标签: c# wpf listview

我一直在关注this tutorial以尝试理解XML,WPF和C#(来自Fortran)。我已经使功能正常工作(感谢教程),但是我很难修改它以使用WPF而不是WinForms。

基本上,当我点击“获取RSS”按钮时,会发生以下情况:

RssManager reader = new RSSManager();
ObservableCollection<Rss.Items> _list = new ObservableCollection<Rss.Items>();
reader.Url = txtFeed.Text;
reader.GetFeed();
_list = (ObservableCollection<Rss.Items>)reader.RssItems;

listview只是空白。它的代码如下。此外,使用列表框尝试此操作会导致为列表中的每个项目而不是我的数据填充的类的名称:

<ListView ItemsSource="_rssItems">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Title}"/>
        </GridView>
    </ListView.View>
</ListView>

是否有可能做一些事情(再次,原谅我的无知,在这里):

_list.Add( new Rss.Items());

列表(_list)包含我需要的所有信息,我只是想弄清楚如何将它正确绑定(或添加到ListView)。

2 个答案:

答案 0 :(得分:1)

看起来你有点迷失了。

最终,您希望将视图(WPF表单)绑定到View-Model,将View-Model绑定到模型(RSSManager)。

现在让我们将视图直接绑定到模型。

在构造函数中,您创建模型的新实例,并将其分配给数据上下文。

只要形式 -

,这个模型就会存在
    public MainWindow()
    {
        InitializeComponent();
        _model = new RssManager();
        DataContext = _model;

    }

然后在您的XAML中将项目源绑定到您的集合属性:

       <ListView ItemsSource="{Binding Path=RssItems}">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Title}"/>
                </GridView>
            </ListView.View>
        </ListView>

请注意,“Path = RssItems”与您分配给DataContext的内容相关。

然后在您的刷新按钮逻辑中调用:

_model.Url = txtFeed.Text;
_model.GetFeed();

你最终想要做的是在中间放置另一层。这是视图模型。您可能已经猜到了View模型的视图模型。

视图模型的工作是收集有关视图状态的信息,并从视图显示的模型中公开数据。它还可以保存当前的ui状态信息 - f.e。选择表中的哪一行,因为某些命令可能会在以后执行。实质上,它允许从代码中抽象出视图的所有逻辑。您的命令操作选择哪一行 - 无论选择哪种控件类型。

答案 1 :(得分:0)

Lee在他的评论中建议,ListView的ItemsSource属性的绑定似乎不正确。有多种方法可以解决这个问题,具体取决于项目的设计/结构。

为了DataBind,ListView将需要某种DataContext(顾名思义)是一种用于绑定的Context。如果您正在使用MVVM,那么整个Window / Control的DataContext很可能是ViewModel。在这种情况下,您绑定到ViewModel的属性,如下所示:

<ListView ItemsSource="{Binding RssItems}">...</ListView>

这假设您有一个带有公共RssItems属性的ViewModel(它是某种List / Enumerable),而ViewModel是DataContext。

如果您没有使用MVVM,那么有很多方法可以使用DataBinding和不使用DataBinding来分配ItemsSource。我建议的最简单的方法是,如果你对DataBinding不太熟悉,那就是手动分配ItemsSource,如下所示:

的Xaml:

<ListView x:Name="MyRssList">...</ListView>

代码背后(在UI加载后以及创建/填充_list之后的某个地方):

MyRssList.ItemsSource = _list;

这不使用DataBinding,但它将完成工作。如果您想从DataBinding开始,您可以执行以下操作:

XAML:

<ListView x:Name="MyRssList" ItemsSource="{Binding}>...</ListView>

代码背后:

MyRssList.DataContext = _list;

这会将List指定为ListView的DataContext,然后将ItemsSource属性DataBind指向DataContext。

总的来说,你走在正确的轨道上。我建议您在DataBindingMVVM上阅读一些内容。 MVVM是利用WPF强大的DataBinding功能的一种非常好的方式,对DataBinding的深刻理解对于设计和构建优秀的WPF应用程序非常有价值。

希望这会有所帮助。祝好运!