【发布时间】:2017-02-24 06:56:28
【问题描述】:
我遇到了 WPF 关联的问题 GridViewColumn 值到组合框项值
我正在使用枚举对象填充到组合框。
无法将 GridItemColumn(durum) 绑定到 ComboboxItems
枚举
[TypeConverter(typeof(EnumDescriptionTypeConverter))]
public enum eViziteDurumlari
{
[Description("Onaysız")]
Onaysiz = 0,
[Description("Onaylı")]
Onayli = 1,
[Description("Hepsi")]
Hepsi = 99
}
[TypeConverter(typeof(EnumDescriptionTypeConverter))]
public enum eViziteDurum
{
[Description("Onaysız")]
Onaysiz = 0,
[Description("Onaylı")]
Onayli = 1,
}
枚举类
public class EnumDescriptionTypeConverter : EnumConverter
{
public EnumDescriptionTypeConverter(Type type)
: base(type)
{
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
if (value != null)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
if (fi != null)
{
var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
return ((attributes.Length > 0) && (!String.IsNullOrEmpty(attributes[0].Description))) ? attributes[0].Description : value.ToString();
}
}
return string.Empty;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
public class EnumBindingSourceExtension : MarkupExtension
{
private Type _enumType;
public Type EnumType
{
get { return this._enumType; }
set
{
if (value != this._enumType)
{
if (null != value)
{
Type enumType = Nullable.GetUnderlyingType(value) ?? value;
if (!enumType.IsEnum)
throw new ArgumentException("Type must be for an Enum.");
}
this._enumType = value;
}
}
}
public EnumBindingSourceExtension() { }
public EnumBindingSourceExtension(Type enumType)
{
this.EnumType = enumType;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (null == this._enumType)
throw new InvalidOperationException("The EnumType must be specified.");
Type actualEnumType = Nullable.GetUnderlyingType(this._enumType) ?? this._enumType;
Array enumValues = Enum.GetValues(actualEnumType);
if (actualEnumType == this._enumType)
return enumValues;
Array tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1);
enumValues.CopyTo(tempArray, 1);
return tempArray;
}
}
数据表
private DataTable DataTableOlustur()
{
Islemler = null;
using (Islemler = new DataTable())
{
Islemler.Columns.Add("firmaadi", typeof(string));
Islemler.Columns.Add("firmakodu", typeof(string));
Islemler.Columns.Add("tckimliknr", typeof(string));
Islemler.Columns.Add("adisoyadi", typeof(string));
Islemler.Columns.Add("bas_istirahat", typeof(DateTime));
Islemler.Columns.Add("bit_istirahat", typeof(DateTime));
Islemler.Columns.Add("durum", typeof(int));
return Islemler;
}
return null;
}
XAML
<ListView x:Name="lstItems">
<ListView.View>
<GridView x:Name="gridView" ScrollViewer.CanContentScroll="True" TextSearch.Text="True">
<GridViewColumn Width="120" Header="Firma Kodu" DisplayMemberBinding="{Binding firmakodu}"/>
<GridViewColumn Width="220" Header="Firma Adı" DisplayMemberBinding="{Binding firmaadi}" />
<GridViewColumn Width="120" Header="TC Kimlik No" DisplayMemberBinding="{Binding tckimliknr}"/>
<GridViewColumn Width="auto" Header="Adı Soyadı" DisplayMemberBinding="{Binding adisoyadi}" />
<GridViewColumn Width="120" Header="İstirahat Baş. Tarihi" DisplayMemberBinding="{Binding bas_istirahat,StringFormat={}{0:dd/MM/yyyy}}" />
<GridViewColumn Width="120" Header="İstirahat Bit. Tarihi" DisplayMemberBinding="{Binding bit_istirahat,StringFormat={}{0:dd/MM/yyyy}}" />
<GridViewColumn Header="Durum">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" MinWidth="150"
ItemsSource="{Binding Source={local:EnumBindingSource {x:Type local:eViziteDurum}}}"
SelectedValue="{Binding Path=durum}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
我看不到组合框的数据表值
对不起英语不好
【问题讨论】:
-
我不明白...
Onayli = 2但在你的图片中有一个1,你写的应该是Onayli?我也不太确定local:EnumBindingSource在做什么。 -
您的 1 是 Onaylı,但如果您查看索引端,它是第 0 次尝试使用 0。
-
我更改 0 = Onaysiz,1 = Onayli,无法更改结果,不要将网格项目(硬粒小麦)与组合框项目绑定
-
确认了问题...使用枚举值类型的
ItemsSource和绑定到int的SelectedValue,整个事情都不起作用。您可以尝试在SelectedValue="{Binding Path=durum}"上使用转换器,该转换器在int和eViziteDurum值之间进行显式转换 -
关于您的问题的旁注:当您遇到
ComboBox的问题时,您应该尝试仅使用组合框来重现问题(而不是DataGrid后面有一些DataTable)。对于您的问题,将静态 2 值枚举类型数组设置为 itemssource 并将所选值绑定到某个整数属性就足够了。其他一切都只是分散了问题的注意力。
标签: c# wpf xaml combobox enums