这不可能这么困难。 WPF中的TreeView不允许设置SelectedItem,说该属性是ReadOnly。我填充了 TreeView,甚至在数据绑定集合更改时进行更新。
我只需要知道选择了什么项目。我正在使用 MVVM,因此没有代码隐藏或变量来引用树视图。这是唯一的解决方案我发现,但这是一个明显的黑客行为,它在 XAML 中创建另一个元素,该元素使用 ElementName 绑定将自身设置为树视图所选项目,然后您也必须绑定您的 Viewmodel。Several other 问题被问到这个问题,但没有给出其他可行的解决方案。
我见过这个问题,但是使用给出的答案会给我带来编译错误,由于某种原因,我无法将对 Blend sdk System.Windows.Interactivity 的引用添加到我的项目中。它说“未知错误 system.windows 尚未预加载”,我还没有弄清楚如何解决这个问题。
对于奖励积分:微软为什么要将此元素的 SelectedItem 属性设置为只读?
您实际上并不需要直接处理 SelectedItem 属性,而是绑定IsSelected到视图模型上的属性并在那里跟踪所选项目。
草图:
<TreeView ItemsSource="{Binding TreeData}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
public class TViewModel : INotifyPropertyChanged
{
private static object _selectedItem = null;
// This is public get-only here but you could implement a public setter which
// also selects the item.
// Also this should be moved to an instance property on a VM for the whole tree,
// otherwise there will be conflicts for more than one tree.
public static object SelectedItem
{
get { return _selectedItem; }
private set
{
if (_selectedItem != value)
{
_selectedItem = value;
OnSelectedItemChanged();
}
}
}
static virtual void OnSelectedItemChanged()
{
// Raise event / do other things
}
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
if (_isSelected != value)
{
_isSelected = value;
OnPropertyChanged("IsSelected");
if (_isSelected)
{
SelectedItem = this;
}
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)