2010-08-25 5 views
1

У меня есть TreeView, где у каждого элемента есть флажок. Я хочу, чтобы TextBlock обновлялся всякий раз, когда элемент отмечен или снят с отметки в TreeView. TextBlockText должен быть привязан к свойству CheckedVersions на моем DataContext, так что когда я прочитал свойство CheckedVersions, он дает мне строку, представляющую все отмеченные элементы в TreeView. Проверенные элементы должны быть представлены в строке с разделителями с запятой. Какой был бы лучший способ сделать это? У меня есть следующий код XAML:WPF, обновление TextBlock при проверке CheckBox

<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 обновлениях. Может быть, если я установил UpdateSourceTrigger на Text переплет в TextBlock? Что я должен установить?

ответ

0

Я думаю, что ваша модель дерева должна «знать» все версии VersionViewModels, а затем все, что вам нужно сделать, это зарегистрировать событие propertychanged и установить свойство «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 
} 
Смежные вопросы