2012-07-21 127 views
1

我一直在关注this tutorial以尝试理解XML,WPF和C#(从Fortran出来)。我已经得到了功能的工作(感谢教程),但我有麻烦修改它与WPF,而不是WinForms。将ObservableCollection绑定到ListView

从本质上讲,当我点击 “获取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。

+0

您绑定到_rssItems,但将其存储在_list中?从我看到的我会认为你的ItemsSource应该是{Binding _list}。 – 2012-07-21 22:45:26

回答

1

看起来你有点迷路。

最终,您希望将视图(WPF表单)绑定到视图模型,并将视图模型绑定到模型(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> 

注意= RssItems“与您分配给DataContext的任何内容有关。

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

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

什么,你最终要的做的就是把另一个层在中间。这是视图模型。视图模型就像您可能已经猜到了视图的模型一样。

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

0

正如李建议在他的评论中,ListView的ItemsSource属性的绑定看起来不正确。有多种方法可以解决这个问题,这取决于你的项目是如何设计/结构化的。

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

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

这里假设你有一个公共的RSSItems属性视图模型(这是某种形式的名单/可枚举)和视图模型是DataContext的。

如果您不使用MVVM,有很多方法可以使用DataBinding和不使用DataBinding来分配ItemsSource。我建议,如果你不与数据绑定完全舒适的最简单的方法,将是手动分配的ItemsSource,就像这样:

XAML中:在UI加载代码后面(后某处

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

并且在创建/填充_list后):

MyRssList.ItemsSource = _list; 

这不使用DataBinding,但它会完成工作。如果你想与数据绑定开始时,你可以做到以下几点:

XAML:

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

代码背后:

MyRssList.DataContext = _list; 

这将列表指定为ListView控件的DataContext的,然后DataBind ItemsSource属性到DataContext。总体而言,您正处在正确的轨道上。我建议您阅读DataBindingMVVM。 MVVM是利用WPF强大的DataBinding功能的一种非常好的方式,对DataBinding的深入理解对于设计和构建优秀的WPF应用程序非常有价值。

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

相关问题