首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF Hierarchical ViewModel FindAncestor数据绑定错误

WPF Hierarchical ViewModel FindAncestor数据绑定错误
EN

Stack Overflow用户
提问于 2013-04-11 06:26:07
回答 2查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
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获取的用户的名称。

我的问题在于视图中的数据绑定。

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

让我说得更清楚一些:

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

2) MainWindow.xaml文件中有一节指定了将特定视图绑定到RegisterUserViewModel的DataTemplate,如以下代码所示:

代码语言:javascript
复制
<Window.Resources>
    <ResourceDictionary>
        <DataTemplate DataType={x:Type ViewModel:RegisterUserViewModel}">
            <View:RegisterUserView />
        </DataTemplate>
    <ResourceDictionary>
<Window.Resources>

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

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

但是,我想让datagrid上的"Name“列使用一个DataGridComboBoxColumn,并将其ItemsSource属性设置为"UsersFromAD”属性,该属性位于我的"RegisterUserViewModel“类上。

为此,我使用了以下xaml:

代码语言:javascript
复制
<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}"
                        />

然而,这是行不通的。每当我运行该应用程序时,我都会从输出窗口中获得以下内容:

代码语言:javascript
复制
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')

有人能帮助我正确地设置这些绑定吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-13 02:44:52

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

代码语言:javascript
复制
<UserControl.Resources>
    <CollectionViewSource x:Key="cvsUsersFromAD" Source="{Binding UsersFromAD}" />
</UserControl.Resources>

然后,将我的DataGridComboBoxColumn绑定到我的CollectionViewSource,如下所示:

代码语言:javascript
复制
<DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource cvsUsersFromAD}}"
                        />
票数 2
EN

Stack Overflow用户

发布于 2013-04-11 08:27:32

FindAncestor正在元素树中搜索类型,而不是在树中元素的DataContext中搜索。因此,对于列的绑定ItemSource,您可以尝试如下(据我所知,您的对象图)

代码语言:javascript
复制
<DataGridComboBoxColumn ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type View:RegisterUserView}}, Path=DataContext.UsersFromAD}"
                        />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15937589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档