ObservableCollection绑定到Listview

时间:2012-07-11 21:11:56

标签: wpf binding constructor observablecollection

我真的不明白为什么以及后台会发生什么,所以请帮助我。 我有一个简单的ListView:

<ListView Height="100" HorizontalAlignment="Left" Margin="67,84,0,0" ItemsSource="
{Binding Path=ListBinding}" Name="listView1" VerticalAlignment="Top" Width="351" />

和一个按钮:

<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="162,41,0,0"
 Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />

我将datacontext设置为我的&#34; viewmodel&#34;类:

        InitializeComponent();

        this.DataContext = new VM1();

现在,如果我在VM1的构造函数中初始化了obscollection,那么当我使用button1_click函数填充ListBinding时绑定有效:

private void button1_Click(object sender, RoutedEventArgs e)
{
    (this.DataContext as VM1).Do();
}

public VM1()
{
   ListBinding = new ObservableCollection<string>();
}

public void Do()
{
    ListBinding.Add("VM1 works 1");
    ListBinding.Add("VM1 works 2");
}

但如果我在Do()函数中初始化它,它不会:

public VM1()
{ }

public void Do()
{
   ListBinding = new ObservableCollection<string>();
   ListBinding.Add("VM1 NOT works 1");
   ListBinding.Add("VM1 NOT works 2");
}

我想这个问题的答案可能只是一个班轮,我想了解&#34;为什么&#34;。 谢谢!

1 个答案:

答案 0 :(得分:1)

您没有列出ListBinding属性的代码。 属性setter必须调用NotifyOfPropertyChange,以便更新绑定。 ObservableCollection自动更新列表更改的CONTENTS,而不是整个列表对象。

希望有所帮助。

编辑:这是属性的代码:

    private ObservableCollection<string> _listBinding // backing field
    public ObservableCollection<string> ListBinding
    {
        get { return _listBinding; }
        set {
            _listBinding = value;
            NotifyOfPropertyChange("ListBinding"); // let the bindings update
        }
    }