2016-07-03 9 views
1

ObservableCollectionを使用して問題が発生しました。特に、UIにグリッドを更新しないアイテムが追加されました。 DateMinute:あなたは、私は次のバインディングを持つ2つの列を持つグリッドをした見ることができますどのようにObservableCollection - UIを更新できません。

<ListView ItemsSource="{Binding Playing}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Data" Width="150" DisplayMemberBinding="{Binding Path=Date}"/> 
      <GridViewColumn Header="Minuto" Width="70" DisplayMemberBinding="{Binding Path=Minutes}"/> 
     </GridView> 
    </ListView.View> 
    </ListView> 

:前に私はあなたに興味を持ってXAML構造を示したい、詳細に説明します。このようにして、特定のアイテムの詳細を更新できます。私はきた私のLiveViewModelで

<Window.DataContext> 
    <VM:LiveViewModel /> 
</Window.DataContext> 

xmlns:VM="clr-namespace:Live.Resources.UI.ViewModels" 

と:

このグリッドは、私はこのようなのDataContextを設定したすべての最上部に、私のMainWindow.xamlの一部であり、このクラスの定義:

このクラスは、内部でINotの実装を持つViewModelを継承します。 ifyPropertyChangedは、単に完全性のため:

public event PropertyChangedEventHandler PropertyChanged; 

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) 
{ 
    if (EqualityComparer<T>.Default.Equals(field, value)) return false; 
    field = value; 
    OnPropertyChanged(propertyName); 
    return true; 
} 

今の私のObservableCollectionは、この定義を持ってプレイモデルに基づいています。

public class Playing : ViewModel 
{ 
    private string _dateTime; 
    private string _minutes; 

    public string Date 
    { 
     get { return _dateTime; } 
     set { SetField(ref _dateTime, value); } 
    } 

    public string Minutes 
    { 
     get { return _minutes; } 
     set { SetField(ref _minutes, value); } 
    } 

    ... 

また、このクラスはINotifyPropertyChangedのを実装します。私は私のコレクションに項目を追加するときだから私は(私のMainWindow.xamlで)これをやった

LiveViewModel lsVm = new LiveViewModel(); 

     var playingCollection = lsVm.Playing; 

     playingCollection.Insert(0, new Playing 
     { 
      Date = "03/07/2016", 
      Minutes = "5", 
      Home = "foo", 
     }); 

残念ながらグリッドで、私は任意の要素が追加され見ることができません。 静的コレクションを作成した場合、静的コレクションとしてObservableCollectionを設定した場合、追加された要素が表示されますが、静的以外のプロパティもあり、更新されません。

私は間違っていますか?ありがとう。

+0

'DataGrid'に' ItemSource'バインディングを設定しましたか?私は何も見ないので。 – hazevich

+0

@hazevichはい、申し訳ありません。質問を更新します。 – Heisenberg

+0

ViewModelの 'lsVm'インスタンスは、' DataGrid'があるビューで使用されているのと同じインスタンスですか? – hazevich

答えて

1

この理由は、lsVmLiveViewModelのインスタンスがMainWindowDataContextのインスタンスと異なるためです。

ここで何が起こるか - ウィンドウが作成されると、それはLiveViewModelのインスタンスを作成し、あなたは限りあなたからコレクションを修正しているように、コード

<Window.DataContext> 
    <VM:LiveViewModel /> 
</Window.DataContext> 

のこれらの行を提供しているようDataContextを設定し、方法にMainWindow.xamlのコードビハインドがあるあなたは、この問題を解決することができます

1あなたは、ViewModelDataContextを使用してアクセスする必要があるので、あなたのようになりますことができます:

var lsVm = this.DataContext as LiveViewModel; 

if (lsVm != null) 
{ 
    var playingCollection = lsVm.Playing; 
    playingCollection.Insert(0, new Playing 
    { 
     Date = "03/07/2016", 
     Minutes = "5", 
     Home = "foo", 
    }); 
} 

2あなたは、コードビハインドからLiveViewModelのインスタンスを作成したら、このインスタンスを使用してDataContextを設定する必要があります。

LiveViewModel lsVm = new LiveViewModel(); 

this.DataContext = lsVm; 

var playingCollection = lsVm.Playing; 

playingCollection.Insert(0, new Playing 
{ 
    Date = "03/07/2016", 
    Minutes = "5", 
    Home = "foo", 
}); 

UPD また、あなたがofcourseの第二のアプローチを使用している場合XAMLコードからDataContextを設定する必要はありません。

関連する問題