在我的WPF应用程序中,我使用MVVM模式。我的视图有一个树视图,我绑定了一个对象的observableCollection如下所定义。我想做的是当绑定对象将dirty属性设置为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集合中引用的ViewModels都派生自公开"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
这是因为你的HierarchicalItem(你有问题的那个)没有为它的IsDirty属性使用完整的INPC方法。视图模型可以,但这还不够,因为DataTemplate将使用HierarchicalItem的IsDirty属性,因此也需要完整的INPC属性
改成这个,应该没问题。
private bool _isDirty;
public bool IsDirty
{
get { return _isDirty; }
protected set
{
_isDirty = value;
OnPropertyChanged("IsDirty");
}
}
尽管对于您的用例,您需要找出一些方法来触发它。或者你可以尝试的另一件事是将HierarchicalItem DataTemplate中的绑定更改为
<DataTrigger Binding="{Binding ViewModel.IsDirty}" Value="True">