2011-03-14 140 views
0

到目前为止,我已经有了我在Xaml中设置ItemSource = {Binding}然后在.CS文件中我说listview.datacontext = myobject和视图加载就好。但是现在我需要有一个更新为数据更新的列表。所以经过一些研究后,我发现了ObservableCollections并重写了我的代码以使用它。但是当我将数据对象设置为列表视图时,无法显示数据。如何让我的WPF ListView与我的List正确绑定,以便视图在数据更改时更新?

我的XAML:

  <ListView ItemsSource="{Binding Tests}" Name="DataCompareTests" Margin="0,0,5,0" Grid.Column="0"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="TestCase" Width="200" DisplayMemberBinding="{Binding name}" /> 
        </GridView> 
       </ListView.View> 
      </ListView> 

我Xaml.cs:

readonly DataCompare dataCompare = new DataCompare(); 

public void Execute_Click(object sender, RoutedEventArgs e) 
    { 

     var Tests = new ObservableCollection<TestCases>(); 
     Tests = dataCompare.LoadTestCases(); //located in another class file 
     //DataCompareTests.DataContext = Tests; 
    } 

如果我删除了 “测试” 在我的XAML中结合并从.DataContext行中删除上述评论的一部分,视图显示正确的信息。然而,这是我的假设,如果我希望我的视图更新为数据,我需要在绑定中指定我的对象。我如何正确设置?我似乎无法找到正确的答案。

感谢,

杰森

回答

0

看来我的担心毫无意义,而且我首先正确地做到了这一点。

根据MSDN:

“不过,如果你绑定到已经创建了一个对象,你需要设置> DataContext的代码,如下面的例子 ...。 myListBox.DataContext = myDataSet;“

我的对象已经创建好了,我确实在代码中设置了DataContext。我所要做的就是将ListView ItemSource保留为{绑定},并且每次添加到Tests对象时,列表都会更新。

我不能相信我花了整整一天怀疑我正确地做这件事,而没有前进检查。 :-)

2

我认为你需要一个更好一点熟悉绑定和一般的面向对象编程。

如果将datacontext设置为模型对象,则“.Tests”应该是该模型对象的公共属性。此外,不这样做:

var someVariable = new SomeClassThatTakesWorkToConstruct(); 
someVarialbe = someOtherVariable.SomeMethod(); 

你的意思做的是这样的: VAR someVariable = someOtherVariable.SomeMethod();

这是2个很好的理由1)你不是在浪费ObservableCollection的构造。 2)你的代码将更容易重构(由SomeMethod返回的类型可以改变,而不必改变你的someVariable的声明)。

编辑,额外的资源:

Databinding Overview 你已经有了指定的路径,但指定的绑定没有

MVVM Article 关于使用常见的MVVM WPF模式的大文章,可帮助您保持面向代码对象,干净等等,即使是复杂的UI交互。

+0

我完全同意。不幸的是,我在一个“质量保证”组织中,没有开发人员的代码审查的好处,以更好地教育自己。我基于我的代码来自本网站和其他地方的示例。如果您对我应该查阅的资源有任何建议,我会对此敞开大门。 – Jason 2011-03-14 18:30:01

+1

查看我的编辑。你单独运行示例做得很好。 – marr75 2011-03-14 18:36:23

相关问题