WPF,检查CheckBox时更新TextBlock

时间:2010-08-25 21:22:56

标签: c# wpf events data-binding inotifypropertychanged

我有TreeView,其中每个项目都有一个复选框。我希望只要在TextBlock中选中或取消选中某个项目,就会更新TreeViewTextBlock的{​​{1}}应该绑定到Text上的CheckedVersions属性,这样当我读取DataContext属性时,它会给我一个字符串代表CheckedVersions中所有选中的项目。选中的项应以分号分隔的字符串表示。最好的方法是什么?我有以下XAML:

TreeView

我的<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的{​​{1}}绑定上设置UpdateSourceTrigger?但是我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

我认为您的树视图模型应该“知道”所有VersionViewModel,然后您需要做的就是注册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
}