基于ViewModel属性实时设置树视图项的文本颜色

本文关键字:文本 颜色 视图 ViewModel 属性 实时 设置 基于 | 更新日期: 2023-09-27 18:06:08

在我的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

基于ViewModel属性实时设置树视图项的文本颜色

这是因为你的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">