0

バックグラウンドで何が起こっているのかよくわからないので、手伝ってください。私は単純な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を「viewmodel」クラスに設定します。

        InitializeComponent();

        this.DataContext = new VM1();

ここで、VM1のコンストラクターでobscollectionを初期化すると、listBindingにbutton1_click関数を設定すると、バインディングが機能します。

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");
}

これに対する答えはワンライナーかもしれないと思います、そして私は「なぜ」を理解したいと思います。ありがとう!

4

1 に答える 1

1

ListBindingプロパティのコードをリストしていません。プロパティセッターは、バインディングが更新されるようにNotifyOfPropertyChangeを呼び出す必要があります。ObservableCollectionは、リストオブジェクト全体ではなく、リスト変更の内容で自動的に更新されます。

お役に立てば幸いです。

編集:プロパティのコードは次のとおりです。

    private ObservableCollection<string> _listBinding // backing field
    public ObservableCollection<string> ListBinding
    {
        get { return _listBinding; }
        set {
            _listBinding = value;
            NotifyOfPropertyChange("ListBinding"); // let the bindings update
        }
    }
于 2012-07-11T21:33:36.017 に答える