私のWPFアプリケーションでは、MVVMパターンを使用しています。私のビューには、以下に定義されているように、オブジェクトのobservableCollectionをバインドするツリービューがあります。私がやりたいのは、バインドされたオブジェクトがダーティプロパティをtrueに設定したときに、ツリーアイテム名の色を変更することです。最初にツリーにデータを入力したときに色を設定できますが、プロパティがfalseとtrueの間で変更されたときに変更が反映されません。
public class HierarchicalItem
{
private readonly ObservableCollection<HierarchicalItem> _children = new ObservableCollection<HierarchicalItem>();
public ViewModelBase ViewModel { get; set; }
public string Name
{
get { return ViewModel.ViewModelName; }
}
public ICollection<HierarchicalItem> Children
{
get { return _children; }
}
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
if (_isSelected)
EventSystem.Publish(new SelectedViewModelMessage { SelectedViewModel = ViewModel });
}
}
public bool IsDirty
{
get { return ViewModel.IsDirty; }
}
}
これはツリービューxamlです:
<TreeView Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=Views}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True"/>
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=OneWayToSource}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:HierarchicalItem}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IsDirty}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
ツリーにバインドされるコレクションは次のとおりです。
private readonly ObservableCollection<HierarchicalItem> _views = new ObservableCollection<HierarchicalItem>();
public ObservableCollection<HierarchicalItem> Views
{
get { return _views; }
}
HierarchicalItemコレクションで参照されるViewModelはすべて、「IsDirty」プロパティを公開する基本クラスから派生します。これは明らかに状態を変化させているので、コーディングを間違えたのか、それとも私が達成したいことがこの方法で実行できないのかはわかりません。クラスはすべて「INotifyPropertyChanged」インターフェースを使用します。ViewModel基本クラスの「IsDirty」プロパティは次のとおりです。
public class ViewModelBase : ValidatableModel
{
#region Properties
private bool _isDirty;
public bool IsDirty
{
get { return _isDirty; }
protected set
{
_isDirty = value;
OnPropertyChanged("IsDirty");
}
}
.
.
.
Etc