【问题标题】:WPF, update TextBlock when CheckBox checkedWPF,选中 CheckBox 时更新 TextBlock
【发布时间】:2011-04-03 23:23:50
【问题描述】:

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

<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 更改TreeView 中的VersionViewModel 实例时,CheckedVersions 会更新。也许如果我在TextBlock 中的Text 绑定上设置UpdateSourceTrigger?不过,我应该将其设置为什么?

【问题讨论】:

    标签: c# wpf events data-binding inotifypropertychanged


    【解决方案1】:

    我认为您的树视图模型应该“知道”所有 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多