【发布时间】:2021-02-01 10:36:50
【问题描述】:
我有一个带有视图模型和一些嵌套 UI 元素的 WPF 项目。这是 XAML 的(相关部分):
<UserControl> // DataContext is MyVM (set programmatically)
<TreeView ItemsSource="{Binding Trees}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Subtrees}">
<StackPanel>
<ListView ItemsSource="{Binding Contents}"
SelectedValue="{Binding SelectedContent}" // won't work: Tree has no such property
SelectionMode="Single"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</UserControl>
ViewModel 类的代码如下:
public class MyVM : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public IEnumerable<Tree> Trees { get; set; }
private object _selectedContent;
public string SelectedContent
{
get => _selectedContent;
set
{
_selectedContent = value;
OnPropertyChanged();
}
}
}
这里是Tree类的代码:
public class Tree
{
public IEnumerable<Tree> Subtrees { get; set; }
public IEnumerable<string> Contents { get; set; }
}
我只想在全局范围内为所有 ListViews 选择一个选项。就像here一样,我想将所有ListViews绑定到视图模型MyVM中的属性SelectedContent。
问题在于ListView 的数据上下文是Tree,而不是来自顶级用户控件的MyVM。 (应该是Tree,因为我们要显示Contents。)我知道我可以使用SelectedValuePath 向下绑定,但是我如何向上绑定以将SelectedValue 绑定到MyVM 属性SelectedContent?
我试过SelectedValue="{Binding RelativeSource={RelativeSource AncestorType ={x:Type UserControl}}, Path=SelectedContent}",但没用。
【问题讨论】:
标签: c# wpf data-binding