Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用整数字段和枚举填充DataGridComboxColumn;显示名称_C#_Wpf_Xaml_Datagrid_Material Design In Xaml - Fatal编程技术网

C# 使用整数字段和枚举填充DataGridComboxColumn;显示名称

C# 使用整数字段和枚举填充DataGridComboxColumn;显示名称,c#,wpf,xaml,datagrid,material-design-in-xaml,C#,Wpf,Xaml,Datagrid,Material Design In Xaml,我从包含用户数组的数据库接收到一个查询,在用户类中有一个名为Role的字节字段。我希望我的datagridcomboxcolumn包含2项。如果角色==0它是的“成员”,如果角色==1它是的“主持人”。 User.cs public enum UserRole { Member, Moderator } public class User { [JsonConstructor] public User(int userId, string email, str

我从包含用户数组的数据库接收到一个查询,在用户类中有一个名为
Role
的字节字段。我希望我的
datagridcomboxcolumn
包含2项。如果
角色==0
它是
的“成员”
,如果
角色==1
它是
的“主持人”

User.cs

public enum UserRole
{
    Member,
    Moderator
}

public class User
{
    [JsonConstructor]
    public User(int userId, string email, string password, string token, string nickname, byte role, uint coins, int power1, int power2, int power3, int power4, DateTime createTime, DateTime? lastLoginTime)
    {
        this.UserId = userId;
        this.Email = email;
        this.Password = password;
        this.Token = token;
        this.Nickname = nickname;
        this.Role = role;
        this.Coins = coins;
        this.Power1 = power1;
        this.Power2 = power2;
        this.Power3 = power3;
        this.Power4 = power4;
        this.CreateTime = createTime;
        this.LastLoginTime = lastLoginTime;
        this.UserRole = (UserRole)role;
    }

    [JsonPropertyName("userId")]
    public int UserId { get; set; }

    [JsonPropertyName("email")]
    public string Email { get; set; }

    [JsonPropertyName("password")]
    public string Password { get; set; }

    [JsonPropertyName("token")]
    public string Token { get; set; }

    [JsonPropertyName("nickname")]
    public string Nickname { get; set; }

    [JsonPropertyName("role")]
    public byte Role { get; set; }

    [JsonPropertyName("coins")]
    public uint Coins { get; set; }

    [JsonPropertyName("power1")]
    public int Power1 { get; set; }

    [JsonPropertyName("power2")]
    public int Power2 { get; set; }

    [JsonPropertyName("power3")]
    public int Power3 { get; set; }

    [JsonPropertyName("power4")]
    public int Power4 { get; set; }

    [JsonPropertyName("createTime")]
    public DateTime CreateTime { get; set; }

    [JsonPropertyName("lastLoginTime")]
    public DateTime? LastLoginTime { get; set; }

    [JsonIgnore]
    public UserRole UserRole { get; set; }
}
main window.xaml

<materialDesign:DataGridComboBoxColumn
  Header="Role"
  Width="100">
    <materialDesign:DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox" BasedOn="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type ComboBox}, ResourceId=MaterialDataGridComboBoxColumnEditingStyle}}" >
            <Setter Property="IsEditable" Value="True" />
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Role}"/>
            <Setter Property="DisplayMemberPath" Value="UserRole"/>
        </Style>
    </materialDesign:DataGridComboBoxColumn.EditingElementStyle
</materialDesign:DataGridComboBoxColumn>


因为您已经有一个用于从数据库强制转换字节值的枚举,所以您只需要一个专用的:

public class UserRoleToStringConverter : IValueConverter
{
    /// <summary>
    /// Converts a value.
    /// </summary>
    /// <param name="value">The value produced by the binding source.</param>
    /// <param name="targetType">The type of the binding target property.</param>
    /// <param name="parameter">The converter parameter to use.</param>
    /// <param name="culture">The culture to use in the converter.</param>
    /// <returns>
    /// A converted value. If the method returns null, the valid null value is used.
    /// </returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var enumValue = UserRole.Member;

        if (value is UserRole)
        {
            enumValue = (UserRole)value;
        }

        switch (enumValue)
        {
            case UserRole.Member: return "Member";
            case UserRole.Role: return "Moderator";
        }
    }

    /// <summary>
    /// Converts a value.
    /// </summary>
    /// <param name="value">The value that is produced by the binding target.</param>
    /// <param name="targetType">The type to convert to.</param>
    /// <param name="parameter">The converter parameter to use.</param>
    /// <param name="culture">The culture to use in the converter.</param>
    /// <returns>
    /// A converted value. If the method returns null, the valid null value is used.
    /// </returns>
    /// <exception cref="NotImplementedException"></exception>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类UserRoleToStringConverter:IValueConverter
{
/// 
///转换一个值。
/// 
///绑定源生成的值。
///绑定目标属性的类型。
///要使用的转换器参数。
///要在转换器中使用的区域性。
/// 
///转换后的值。如果方法返回null,则使用有效的null值。
/// 
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var enumValue=UserRole.Member;
if(值为UserRole)
{
enumValue=(UserRole)值;
}
开关(枚举值)
{
case UserRole.Member:返回“Member”;
case UserRole.Role:返回“主持人”;
}
}
/// 
///转换一个值。
/// 
///绑定目标生成的值。
///要转换为的类型。
///要使用的转换器参数。
///要在转换器中使用的区域性。
/// 
///转换后的值。如果方法返回null,则使用有效的null值。
/// 
/// 
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
请注意,通过查看
CultureInfo
converter参数,如果需要,可以本地化字符串


另一种方法可能是绑定ViewModel的
字符串
属性,以便在ViewModel中使用XAML并添加字符串转换。

因为您已经有一个用于从数据库强制转换字节值的枚举,所以您只需要一个专用的转换:

public class UserRoleToStringConverter : IValueConverter
{
    /// <summary>
    /// Converts a value.
    /// </summary>
    /// <param name="value">The value produced by the binding source.</param>
    /// <param name="targetType">The type of the binding target property.</param>
    /// <param name="parameter">The converter parameter to use.</param>
    /// <param name="culture">The culture to use in the converter.</param>
    /// <returns>
    /// A converted value. If the method returns null, the valid null value is used.
    /// </returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var enumValue = UserRole.Member;

        if (value is UserRole)
        {
            enumValue = (UserRole)value;
        }

        switch (enumValue)
        {
            case UserRole.Member: return "Member";
            case UserRole.Role: return "Moderator";
        }
    }

    /// <summary>
    /// Converts a value.
    /// </summary>
    /// <param name="value">The value that is produced by the binding target.</param>
    /// <param name="targetType">The type to convert to.</param>
    /// <param name="parameter">The converter parameter to use.</param>
    /// <param name="culture">The culture to use in the converter.</param>
    /// <returns>
    /// A converted value. If the method returns null, the valid null value is used.
    /// </returns>
    /// <exception cref="NotImplementedException"></exception>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类UserRoleToStringConverter:IValueConverter
{
/// 
///转换一个值。
/// 
///绑定源生成的值。
///绑定目标属性的类型。
///要使用的转换器参数。
///要在转换器中使用的区域性。
/// 
///转换后的值。如果方法返回null,则使用有效的null值。
/// 
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var enumValue=UserRole.Member;
if(值为UserRole)
{
enumValue=(UserRole)值;
}
开关(枚举值)
{
case UserRole.Member:返回“Member”;
case UserRole.Role:返回“主持人”;
}
}
/// 
///转换一个值。
/// 
///绑定目标生成的值。
///要转换为的类型。
///要使用的转换器参数。
///要在转换器中使用的区域性。
/// 
///转换后的值。如果方法返回null,则使用有效的null值。
/// 
/// 
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
请注意,通过查看
CultureInfo
converter参数,如果需要,可以本地化字符串


另一种方法可能是绑定ViewModel的
字符串
属性,以便在ViewModel中使用XAML并添加字符串转换。

您的代码和XAML中有多个问题需要解决

  • 数据网格列不是可视化树的一部分,这意味着相对的源和元素名称绑定,如绑定
    DataContext。角色
    将不起作用
  • 您的
    UserRole
    类型是一个
    enum
    ,但您希望在组合框列中显示其常量名称作为要从中选择的项。
    ItemsSource
    属性需要枚举类型,而枚举类型不是
  • 我假设您将
    用户的数组或集合绑定到数据网格。这意味着您列的数据上下文是一个
    用户
    实例。在这种情况下,您的组合框
    ItemsSource
    绑定没有意义,因为您正在尝试绑定数据网格数据上下文,该上下文不包含当前用户,即使它包含当前用户,
    Role
    属性是
    字节,而不是可枚举的
  • 您将
    DisplayMemberPath
    设置为
    UserRole
    ,但它将不起作用,因为您希望将组合框绑定到
    UserRole
    枚举的常量,该枚举不包含属性
    UserRole
  • 您的
    用户
    类型既包含
    字节
    类型的
    角色
    ,也包含
    用户角色
    类型的
    用户角色
    。目前尚不清楚您想使用两者的哪个属性以及另一个属性的用途
  • 您的枚举类型具有。如果您在内部使用值为“代码>字节,无论如何,您可以考虑将其更改为<代码>字节< /C>。
  • 只设置编辑样式,而不设置非编辑样式,这将使值在进入编辑模式时弹出,并在离开编辑模式时隐藏
  • 您设置了
    DisplayMemberPath
    ,但我认为您真正想要做的是将
    Role
    属性绑定为选中项
在下面的示例中,我假设您希望使用类型为
byte
Role
属性进行绑定,并且希望显示
public class UserRoleToEnumConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
      return (UserRole)System.Convert.ToByte(value);
   }

   public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      return (byte)(int)value;
   }
}
<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
   <DataGrid.Resources>
      <local:UserRoleToEnumConverter x:Key="UserRoleToEnumConverter"/>
      <ObjectDataProvider x:Key="UserRoles" MethodName="GetValues" ObjectType="{x:Type system:Enum}">
         <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:UserRole"/>
         </ObjectDataProvider.MethodParameters>
      </ObjectDataProvider>
   </DataGrid.Resources>
   <DataGrid.Columns>
      <materialDesign:DataGridComboBoxColumn Header="Role"
                                             IsEditable="True"
                                             Width="100">
         <materialDesign:DataGridComboBoxColumn.EditingElementStyle>
            <Style TargetType="ComboBox" BasedOn="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type ComboBox}, ResourceId=MaterialDataGridComboBoxColumnEditingStyle}}" >
               <Setter Property="IsEditable" Value="True" />
               <Setter Property="ItemsSource" Value="{Binding Source={StaticResource UserRoles}}"/>
               <Setter Property="SelectedItem" Value="{Binding Role, Converter={StaticResource UserRoleToEnumConverter}}"/>
            </Style>
         </materialDesign:DataGridComboBoxColumn.EditingElementStyle>
      </materialDesign:DataGridComboBoxColumn>
   </DataGrid.Columns>
</DataGrid>
<materialDesign:DataGridComboBoxColumn Header="Role"
                                       IsEditable="True"
                                       Width="100"
                                       ItemsSource="{Binding Source={StaticResource UserRoles}}"
                                       SelectedItemBinding="{Binding Role, Converter={StaticResource UserRoleToEnumConverter}}"/>