2017-03-28 3 views
0

私は、目に見える役割とコンポーネントの集合を含む設定ウィンドウを持っています。ここでは、左側のロールを選択すると、右側のロールに関連付けられているコンポーネントが自動的にチェックされます。主な問題は、アクションがシーンの裏で正しく実行されるが、UIには反映されないということです。私のXAMLは、リスト内のチェックボックスを表示するには、データテンプレートで設定されチェックボックスの状態を自動的に更新するのはGUIに反映されません

<ListBox Name="Components" ItemsSource="{Binding Components, Mode=TwoWay}" ScrollViewer.CanContentScroll="False"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <CheckBox Content="{Binding Name}" Foreground="{DynamicResource MainForegroundColor}" IsChecked="{Binding IsChecked, Mode=TwoWay}" Margin="5 5 0 0" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 

私のviewmodelコードは非常に簡単ですが、私は、チェックボックスを保持するためにselectableComponentクラスを作成します状態およびその情報、および役割クラス:

public class SelectableComponent 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
    public bool IsChecked { get; set; } 
} 


public class Role 
{ 
    public string Name { get; set; } 
    public string projectsToWatch { get; set; } 
} 

public ObservableCollection<SelectableComponent> Components { get; set; } 

あなたが役割を変更するときに呼び出されるメソッド:

public void LoadSpecificRoleComponents(string role) 
{ 

    Role r = Config.Instance.Roles.FirstOrDefault(a => string.Equals(a.Name, role, System.StringComparison.InvariantCultureIgnoreCase)); 

    foreach (SelectableComponent sc in Components) 
    { 
     if (string.Equals(r.projectsToWatch, "*")) 
     { 
      sc.IsChecked = true; 
     } 
     else 
     { 
      sc.IsChecked = r.projectsToWatch.Contains(sc.Name, System.StringComparison.InvariantCultureIgnoreCase); 
     } 
    } 

    RaisePropertyChanged("Components"); 
} 

私が理解できないのは、UIが正しく更新されない理由です。私はコンポーネント上でRaisePropertyChanged("Components")を行っているので、それが更新されるはずです。

どのようなタイプのヘルプでも分かりますが、これはおそらく私が欠けている簡単なことです。

+0

あなたはINotifyPropertyChangedのを実装する必要がありますSelectableComponentの名前 – Sasha

+0

混乱して申し訳ありませんが、コンポーネントがチェックされた状態をクリアしてから、プロジェクトをアクティブ化する必要があるかどうかに応じて、状態を変更することができます。 – legrandviking

+0

RaisePropertyChanged( "Components")は、ObservableCollectionがallreadyを通知するときに便利です。 SelectableComponentをviewmodelパターンに変更し、RaisePropertyChanged( "Components")の後にNotifyPropertyChangedを – GCamel

答えて

1

SelectableComponentはINotifyPropetyChangedを実装するとにisCheckedためRaisePropertyChangedイベントを発生させる必要があります:

private bool _isChecked 

public bool IsChecked { 
get{ return _isChecked;} 
set 
{ 
     if(_isChecked != value) 
     { _isChecked= value; 
      RaisePropertyChanged("IsChecked"); 
     } 
} 
} 
+0

セッターの中に変更通知を入れることは必須ではありません。 OPはRaisePropertyChanged( "Components")と呼ばれます。 LoadSpecificRoleComponentsから取得します。 – 3615

+0

実際に私の問題を解決しました。私のクラスのネスティングにより、このプロパティの変更の通知はありませんでした – legrandviking

0

SelectableComponentには、INotifyPropertyChangedを実装する必要があります。そして、そうする:

private string _name = string.Empty; 
public string Name 
{ 
    get{ return _name;} 
    set 
    { 
     _name = value; 
     RaisePropertyChanged("Name"); 
    } 
} 

そして、あなたのObservableCollectionに同じ操作を行います。

private ObservableCollection<Component> _componentCollection = new ObservableCollection<Component>(); 
public ObservableCollection<Component> Components 
{ 
    get{ return _componentCollection; } 
    set 
    { 
     _componentCollection = value; 
     RaisePropertyChanged("Components"); 
    } 
} 
+0

それは役に立たないでしょう。観察可能なコレクションアイテムのプロパティを変更しても、コレクション自体に対する通知はトリガーされません。 – 3615

関連する問題