gpt4 book ai didi

WPF Hierarchical ViewModel FindAncestor 数据绑定(bind)错误

转载 作者:行者123 更新时间:2023-12-03 10:15:07 30 4
gpt4 key购买 nike

我正在创建一个 MVVM 应用程序,它有两个 View 模型,RegisterUserViewModel 和 UserViewModel。 “RegisterUserViewModel”有一个公共(public)属性,它是“UserViewModel”的集合,如下所示的代码

public class RegisterUserViewModel : ViewModelBase
{
public ObservableCollection<UserViewModel> Users { get; }
public ObservableCollection<string> UsersFromAD { get; }
}

public class UserViewModel : ViewModelBase
{
public string Name { get; set; }
}

“RegisterUserViewModel”类还有一个“UsersFromAD”属性,该属性填充了从 Active Directory 获得的用户名。

我的问题在于我认为的数据绑定(bind)。

我有一个 MainWindow View ,它将其窗口分为两个区域(左侧和右侧):左侧区域有可用命令列表,右侧区域有选项卡控件。
左侧的命令用于在选项卡控件上打开新选项卡。 TabControl 的 ItemsSource 属性绑定(bind)到“ViewModelBase”类的集合。由于 DataTemplate 绑定(bind),TabControl 中打开的每个选项卡都会自动绑定(bind)到特定 View ,具体取决于正在打开的类的类型。

让我更清楚:

1)我在左侧有一个命令,它将“RegisterUserViewModel”的新实例添加到 TabControl 的 ItemsSource 属性绑定(bind)到的“ObservableCollection”中。

2) MainWindow.xaml 文件有一个部分指定了一个 DataTemplate,它将特定 View 绑定(bind)到 RegisterUserViewModel,如下面的代码所示:
<Window.Resources>
<ResourceDictionary>
<DataTemplate DataType={x:Type ViewModel:RegisterUserViewModel}">
<View:RegisterUserView />
</DataTemplate>
<ResourceDictionary>
<Window.Resources>

3) 通过这样做,WPF 会自动将我的 RegisterUserView 的 DataContext 设置为我的 RegisterUserViewModel。

现在,我向我的 RegisterUserView 添加了一个 DataGrid 控件,并将它的 ItemsSource 设置为我的 UserViewModel 集合(用户)。一切正常,添加到集合中的用户显示在 DataGrid 上。

但是,我想要的是数据网格上的“名称”列使用 DataGridComboBoxColumn,其 ItemsSource 属性设置为位于我的“RegisterUserViewModel”类上的“UsersFromAD”属性。

为此,我使用了以下 xaml:
<DataGridComboBoxColumn ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ViewModel:RegisterUserViewModel}}, Path=UsersFromAD}"
SelectedValueBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ViewModel:UserViewModel}}, Path=Name}"
/>

但是,这是行不通的。每当我运行应用程序时,我都会从输出窗口中获得以下信息:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='TestApplication.ViewModel.RegisterUserViewModel', AncestorLevel='1''. BindingExpression:Path=UsersFromAD; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=24004376); target property is 'ItemsSource' (type 'IEnumerable')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='TestApplication.ViewModel.UserViewModel', AncestorLevel='1''. BindingExpression:Path=Name; DataItem=null; target element is 'TextBlockComboBox' (Name=''); target property is 'SelectedValue' (type 'Object')

谁能帮我正确设置这些绑定(bind)?

最佳答案

我通过将 CollectionViewSource 添加到我的 RegisterUserView 的“UserControl.Resources”部分并将 CollectionViewSource 绑定(bind)到我的 UsersFromAD 属性来解决了这个问题,如下所示:

<UserControl.Resources>
<CollectionViewSource x:Key="cvsUsersFromAD" Source="{Binding UsersFromAD}" />
</UserControl.Resources>

然后,通过将我的 DataGridComboBoxColumn 绑定(bind)到我的 CollectionViewSource,如下所示:
<DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource cvsUsersFromAD}}"
/>

关于WPF Hierarchical ViewModel FindAncestor 数据绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15937589/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com