【问题标题】:Getting lookup value from Id inside the binding of DataGrid在 DataGrid 的绑定中从 Id 获取查找值
【发布时间】:2013-09-04 15:38:36
【问题描述】:

我有一种情况,下面的课程会解释

public class UserDetail
{
    public string UserCode{get; set;}
    public uint RoleId{get; set;}
    public uint GroupId{get; set;}
}

和类

public class UserRoleDetail
{
    public uint RoleId{get; set;}
    public string RoleName{get; set;}
}

我有一个数据网格并将数据上下文绑定到 UserDetail 对象的集合。

            <DataGrid x:Name="usersgrid"
                      AlternatingRowBackground="LightBlue"
                      CanUserAddRows="False"
                      CanUserDeleteRows="False"
                      CanUserReorderColumns="True"
                      ItemsSource="{Binding}"
                      CanUserResizeColumns="True"
                      AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="User Code"
                                        Binding="{Binding Path=UserCode}"/>
                    <DataGridTextColumn Header="Role"
                                        Binding="{Binding Path=RoleId}">
                        <!-- Need to get the RoleName by looking up RoleDetails collection-->
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Group"
                                        Binding="{Binding Path=GroupId}"/>
                </DataGrid.Columns>
            </DataGrid>

输出显示 UserDetail 类中的整数 RoleId 字段。我想通过在后面的代码中查找 RoleDetails 集合中的 RoleId 将其显示为 RoleName。

有什么方法可以让我在 xaml 本身中实现这一点。关于使用转换器的任何说明??

提前致谢。

【问题讨论】:

  • 你在哪里保存 UserRoleDetail 集合?在视图模型上?
  • 实际上这些对象来自数据层,并且由于规范化,角色详细信息被隔离到另一个类,UserRoleDetail。我将 UserDetails 和 UserRoleDetails 作为单独的集合。它在后面的代码中可用。 UserRoleDetailsCollection 变量。

标签: c# wpf xaml binding


【解决方案1】:

我的建议是创建一个包装类,比如 UserDetailWrapper,其中包含 UserDetailInstance 和 UserRoleDetailInstance

    public class UserDetailWrapper
    {
        public UserDetail UserDetail
        {
            get;
            set;
        }

        public UserRoleDetail UserRoleDetail { get; set; }
    }

在你后面的代码中,为 UserDetail 集合生成 UserDetailWrapper 列表,并设置对应于 roleID 的 UserRoleDetail。

现在将此集合作为 ItemsSource 绑定到 DataGrid。

你必须相应地更新你的绑定,比如

<DataGridTextColumn Header="User Code"
                                        Binding="{Binding Path=UserDetail.UserCode}"/>

然后对于 UserRoleDetailName 你可以直接做

<DataGridTextColumn Header="Role"
                                        Binding="{Binding Path=UserRoleDetail.RoleName}">

【讨论】:

  • 我同意你的回答,但是有没有任何直接的方法可以在没有包装器的情况下在 xaml 本身中实现这一点。转换器在这里有什么帮助吗?我对使用转换器没有太多想法。
  • mate 转换器在这里没有帮助。像这样想,DataGrid 的每一行都是 UserDetail 对象,所以如果你在 UserDetail 的任何地方都没有引用 UserRoleDetail ,你将如何做到这一点。此外,即使您使用将成为多值转换器的转换器,它将从行的 UserDetail 中获取 RoleId,从 VM 中获取 UserRoleDetails 并返回 RoleName,但之后您将无法设置 RoleName
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2016-10-13
  • 2013-10-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多