私は、目に見える役割とコンポーネントの集合を含む設定ウィンドウを持っています。ここでは、左側のロールを選択すると、右側のロールに関連付けられているコンポーネントが自動的にチェックされます。主な問題は、アクションがシーンの裏で正しく実行されるが、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")
を行っているので、それが更新されるはずです。
どのようなタイプのヘルプでも分かりますが、これはおそらく私が欠けている簡単なことです。
あなたはINotifyPropertyChangedのを実装する必要がありますSelectableComponentの名前 – Sasha
混乱して申し訳ありませんが、コンポーネントがチェックされた状態をクリアしてから、プロジェクトをアクティブ化する必要があるかどうかに応じて、状態を変更することができます。 – legrandviking
RaisePropertyChanged( "Components")は、ObservableCollectionがallreadyを通知するときに便利です。 SelectableComponentをviewmodelパターンに変更し、RaisePropertyChanged( "Components")の後にNotifyPropertyChangedを – GCamel