2010-08-25 34 views
1

我有一個TreeView其中每個項目都有一個複選框。我希望TextBlockTreeView中的某個項目被選中或取消選中時被更新。 TextBlockText應該綁定到我的DataContext上的CheckedVersions屬性,以便當我讀取CheckedVersions屬性時,它會給我一個表示TreeView中所有已檢查項目的字符串。檢查的項目應該用分號分隔的字符串表示。什麼是最好的方法來做到這一點?我有以下XAML:WPF,當CheckBox檢查時更新TextBlock

<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]" 
       x:Key="versionsXml" 
       IsInitialLoadEnabled="True" IsAsynchronous="False" /> 
<HierarchicalDataTemplate x:Key="versionTemplate"> 
    <CheckBox Focusable="False" IsChecked="{Binding Path=IsChecked}" 
       Content="{Binding Path=Name, Mode=OneTime}"/> 
</HierarchicalDataTemplate> 
<TreeView x:Name="trv_version" 
      ItemsSource="{Binding Path=Versions, Mode=OneWay}" 
      ItemTemplate="{StaticResource versionTemplate}" /> 
<TextBlock x:Name="txb_version" Text="{Binding Path=CheckedVersions}" 
      TextWrapping="Wrap" /> 

每個項目在我TreeView是我VersionViewModel類,它實現INotifyPropertyChanged並通知IsChecked屬性發生變化時的一個實例。看起來我應該能夠進入到這樣的狀態,以便IsChecked更改VersionViewModel實例中的TreeView,CheckedVersions更新。也許如果我設置UpdateSourceTriggerText綁定在TextBlock?但是,我應該怎麼設置?

回答

0

我認爲你的樹視圖模型應該「知道」所有的VersionViewModel,然後你需要做的就是註冊到屬性changed事件並根據改變設置「CheckedVersions」屬性。

類似的東西:

public class treeViewModel : INotifyPropertyChanged 
{ 
    public List<VersionViewModel> CurrentVersionViewModel { get; protected set; } 

    public void AddNewVersionViewModel(VersionViewModel vvm) 
    { 
     CurrentVersionViewModel.Add(vvm); 
     vvm.PropertyChanged += new PropertyChangedEventHandler(
      (obj,propEventArgs) => 
       { 
       if (propEventArgs.PropertyName=="IsChecked") 
       { 
       // CheckedVersions change logic according to the new value (this is just the concept) 
        CheckedVersions += (obj as VersionViewModel).IsChecked; 
       } 
       } 
      ); 
    } 

    public string CheckedVersions { get { return _CheckedVersions; } set { _CheckedVersions = value; RaisePropertyChanged("CheckedVersions"); } } 
    private string _CheckedVersions; 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string prop) 
    { 
     if (PropertyChanged!=null) 
     { 
      PropertyChanged(this,new PropertyChangedEventArgs(prop)); 
     } 
    } 

    #endregion 
} 

public class VersionViewModel : INotifyPropertyChanged 
{ 

    public bool IsChecked { get; set; } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
}