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}}"/>