2010-08-25 5 views
1

J'ai un TreeView où chaque élément a une case à cocher. Je veux qu'un TextBlock soit mis à jour chaque fois qu'un élément est coché ou décoché dans le TreeView. Le TextBlockText devrait être lié à la propriété CheckedVersions sur mon DataContext de sorte que quand j'ai lu la propriété CheckedVersions, il me donne une chaîne représentant tous les articles vérifiés dans le TreeView. Les éléments cochés doivent être représentés dans une chaîne séparée par des points-virgules. Quelle serait la meilleure façon de faire cela? Je le XAML suivant:WPF, mise à jour de TextBlock lorsque CheckBox est cochée

<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" /> 

Chaque élément de mon TreeView est une instance de ma classe VersionViewModel, qui met en œuvre INotifyPropertyChanged et avertit lorsque les IsChecked changements de propriété. Il semble que je devrais être en mesure d'accrocher à cela afin que lorsque IsChecked change sur une instance VersionViewModel dans les mises à jour TreeView, CheckedVersions. Peut-être que si je mets UpdateSourceTrigger sur la liaison Text dans le TextBlock? Mais que dois-je faire?

Répondre

0

Je pense que votre modèle d'arborescence doit "connaître" tous les VersionViewModels, puis tout ce que vous devez faire est de vous inscrire à l'événement propertychanged et de définir la propriété "CheckedVersions" en fonction du changement.

quelque chose comme ça:

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 
}