我有TreeView
,其中每个项目都有一个复选框。我希望只要在TextBlock
中选中或取消选中某个项目,就会更新TreeView
。 TextBlock
的{{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
?但是我该怎么做呢?
答案 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
}