在我的WPF應用程序中,我使用了MVVM模式。我的視圖有一個樹形視圖,我綁定了下面定義的對象的observableCollection。我想要做的是在綁定對象將其髒屬性設置爲true時更改樹項目名稱的顏色。我可以在第一次填充樹時設置顏色,但當屬性在false和true之間變化時,它不會反映更改。基於ViewModel屬性實時設置TreeView項目文本顏色
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」接口。這裏是從視圖模型基類中的「IsDirty」屬性:
public class ViewModelBase : ValidatableModel
{
#region Properties
private bool _isDirty;
public bool IsDirty
{
get { return _isDirty; }
protected set
{
_isDirty = value;
OnPropertyChanged("IsDirty");
}
}
.
.
.
Etc
感謝您的回覆。我猜想這將會是這樣直截了當的事情。我的固定代碼現在按預期工作。 – Retrocoder 2013-03-27 09:41:56
很高興你被排序 – sacha 2013-03-27 11:59:55