2017-11-06 20 views
-1

ListViewに異なるボタンを持つユーザーコントロールがあります。私が観測可能なリストをインスタントして、いくつかのアイテムを追加すれば、私は更新することができます。しかし、ボタンを押した後にインスタンス化すると、GUIは更新されません。WPF - MVVMでListViewを更新できません

class ModelViewA { 
private ObservableCollection<ObjectA> myList; 
public ObservableCollection<ObjectA> MyItems {get {return myList;} set {myList = value;}} 
private void OnConfigCommand(int numbers) 
{ 
    myList = new ObservableCollection<ObjectA>(); 
    for(int i = 0; i < numbers; i++) 
    { 
    myList.Add(new Object() { Name="Name" }); 
    } 
    } 

} 
    class ObjectA : INotifyPropertyChanged { 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
      name = value; 
      RaisePropertyChanged("Name"); 
      } 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 

     private void RaisePropertyChanged(string property) 
      { 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs(property)); 
       } 
      } 
    } 

<ListView x:Name="m_List" ItemsSource="{Binding Path=MyItems,UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Top" BorderThickness="2" BorderBrush="DimGray" Margin="0,5,0,0" Height="250"> 
      <ListView.View> 
      <GridView AllowsColumnReorder="False" > 
       <GridViewColumn Header="Name" Width="60" DisplayMemberBinding="{Binding Path= Name}"/> 
       <GridViewColumn Width="80" DisplayMemberBinding="{Binding ButtonName}" > 
       <GridViewColumn.Header> 
        <Button Width="76" Height="110" Content="ButtonName" Tag="0" ToolTip="Click here to import data from *.ini file." Command="{Binding OnConfigCommand}" CommandParameter="0"/> 
       </GridViewColumn.Header> 
       </GridViewColumn> 
      </GridView> 
      </ListView.View> 
    </ListView> 
+0

問題を確実に再現する良い[mcve]がなければ、良い回答を投稿することはできません。つまり、_後にインスタンス化すると、後で 'MyItems'プロパティを設定した後、バインドが設定された後、' ModelViewA'がバインドされているため、バインドされた値が更新されることは期待できません。クラスは 'INotifyPropertyChanged'を実装していません –

+0

ええ、それは難しいと知っていますが、コード全体を投稿することはできません。はい、それは私が意味するものでした。私もそれを試してみましたが、それもうまくいきませんでした。しかし、あなたの助けに感謝します。バインディングの前にGUIを変更してアイテムを設定する方が良いでしょう。 – user3857995

+0

私は、ListViewのUpdateSourceTriggerが問題の一部であると思われます。そこに別の設定を試しましたか? (Peterが言ったことに加えて) – Fildor

答えて

2

クラスModelViewA

class ModelViewA : INotifyPropertyChanged 

とすでにOBJAクラスのために行ったようにイベントを定義するためにもINotifyPropertyChangedのを使用してください。

は、その後、あなたのリストビューのitemsourceのため、この操作を行います。

public ObservableCollection<ObjectA> MyItems 
    { 
    get {return myList;} 
    set { 
      myList = value; 
      RaisePropertyChanged("MyItems"); 
     } 
    } 

を問題は、あなたがそのマイリストの変更内の項目あなたのUIに通知することですが、あなたはMyItemsが変化していることを通知されていません。

+0

はい、観察可能なコレクションの内容が変更された場合、プロパティ変更イベントを発生させる必要はありません。ただし、ここでは実際の観測可能なコレクション自体が置き換えられています。個人的には、この混乱を避けるために、観察可能なコレクションをインスタンス化の後に置き換えないでください。このコレクションのサポートする読み取り専用フィールドを作成し、セッターにクリアと指定アイテムを1つずつ追加させます。 – LordWilmore

+0

もう一度クリアして追加する方が良いかもしれませんが、違いはほとんどありません。私は私の答えで説明したように私は常に私のコレクションを処理します。しかし、あなたがセッターをどのように扱うかについては、独立して、INotyfyPropertyChangedを実装する必要があります。 –

+0

あなたの答えは完全に有効で、私はあなたにそれをアップアップしました、私はOPのために何か特別なものを追加しようとしていました。 – LordWilmore

関連する問題