2013-03-27 37 views
0

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

回答

1

這是因爲你的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"> 
+0

感謝您的回覆。我猜想這將會是這樣直截了當的事情。我的固定代碼現在按預期工作。 – Retrocoder 2013-03-27 09:41:56

+0

很高興你被排序 – sacha 2013-03-27 11:59:55

相關問題