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

时间:2013-03-27 09:07:54

标签: c# mvvm treeview wpf-4.5

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

1 个答案:

答案 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">