2017-02-24 72 views
1

綁定組合框的值我有WPF - 裏面的GridView

我使用枚舉對象進行填充到組合框的值,WPF assoccolation GridViewColumn值到組合框項目的問題。

不能結合GridItemColumn(硬粒),以ComboboxItems

ENUM

[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> 

我不能看到數據表的值來組合框

我的英語不好

對不起enter image description here

+0

我不明白...'Onayli = 2'但在畫面中有一'1',你寫的應該是'Onayli'?另外我不太清楚'local:EnumBindingSource'在做什麼。 – grek40

+0

你的1是Onaylı,但如果你看索引端,它是第0嘗試使用0. – GBursali

+0

我改變0 = Onaysiz,1 = Onayli,無法改變結果, 不要綁定網格物品(硬粒)與Combobox Items –

回答

0

ComboBox.ItemsSource充滿枚舉值,它不會自動轉換SelectedValue之間int和枚舉類型,所以需要有一個轉換器。

代碼:

public class EnumIntegerConverter : IValueConverter 
{ 
    // probably add some code to ensure the enum type is actually set 
    // or move it to the converter parameter in order to use the same converter instance with different types 
    public Type EnumType { get; set; } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // probably add some sanety checks on the involved types and values 
     return Enum.ToObject(EnumType, value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // probably add some sanety checks on the involved types and values 
     return System.Convert.ToInt32(value); 
    } 
} 

XAML資源

<local:EnumIntegerConverter x:Key="enumConverter" EnumType="{x:Type local:eViziteDurum}"/> 

XAML用法

<ComboBox ... SelectedValue="{Binding Path=durum,Converter={StaticResource enumConverter}}"/> 
+0

非常感謝您的回答,grek40! –