在我的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集合中引用的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
答案 0 :(得分:1)
这是因为您的HierarchicalItem(您遇到问题的那个)没有对其IsDirty属性使用完整的INPC方法。 viewmodel可以,但这还不够,因为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">