2012-09-07 7 views
0

사용자 정의 컨트롤 (DataGridView)에 DataGrid가 있습니다. 이 UserControl을 어디에서나 응용 프로그램에서 데이터 그리드의 ItemsSource에 바인딩을 전파하고 사용자 정의 일부 속성이 속성 K에 대한 제공자 라이선스 계약을 정의 할 수 있습니다 예를 들어 K.일반 GridView에서 일반 ComboBox 표현을 해결하는 방법

목록 채 웁니다 :

public class Foo 
{ 
    [Enumeration(IsEnum=true, EnumerationType=typeof(MessageType))] //MessageType is enumeration and is consisted of values: 'Error', 'Warning' and 'Info' 
    public MessageType MessageType { get; set; } 

    [Enumeration(IsEnum=true, EnumerationType=typeof(FooType))] //FooType is enumeration and is consisted of values: 'Sweet' and 'Salty' 
    public FooType FooType { get; set; } 
} 

데이터 그리드가있다 열을 자동 생성하는 이벤트입니다. "enumTemplate"에 대한

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     foreach (Attribute attribute in (e.PropertyDescriptor as System.ComponentModel.PropertyDescriptor).Attributes) 
     { 
      Utilities.EnumerationAttribute enumAttribute = attribute as Utilities.EnumerationAttribute; 

      if (enumAttribute != null 
       && enumAttribute.IsEnum) 
      { 
       DataGridTemplateColumn templateColumn = new DataGridTemplateColumn(); 

       templateColumn.CellTemplate = (DataTemplate)Resources["enumTemplate"]; 

       e.Column = templateColumn; 
      } 
     } 
     e.Column.IsReadOnly = true; 
    } 

자원이 DataTemplate을 같이 MergedDictionary에 정의되어

<DataTemplate x:Key="enumTemplate"> 
    <StackPanel> 
     <ComboBox/> 
    </StackPanel> 
</DataTemplate> 

내가 무엇을 의도 한 것은 그리드 (Enum.GetNames의 반환 값으로 생성 각 콤보 상자의 ItemsSource를 설정하는 것입니다 enumAttribute.EnumerationType)는 string [] 형식입니다.

여기에 많은 익명 성이 있으며 속성, 해당 유형 또는이 DataGrid가 런타임 중에 표시 할 객체 유형의 이름을 알지 못합니다.

나는 여러 가지를 시도했다. ... List 형의 프로퍼티 DataSourcesList를 정의하는 것과 같다. NamedArray는 combobox를 채우기위한 항목과 e.PropertyName의 프로퍼티를 저장하기 때문에 NamedArray 콤보 상자에 사용할 생성되는 ... 뭔가 같은 :

<DataTemplate x:Key="enumTemplate"> 
    <DataTemplate.Resources> 
     <converters:IListToItemsSource x:Key="ilistToItemsSource"/> 
    </DataTemplate.Resources> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding DataSourcesList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:DataGridView}}, Converter={StaticResource ilistToItemsSource}, ConverterParameter={Binding somethingButAllInVaine}}"/> 
    </StackPanel> 
</DataTemplate> 
, 그러나 이것은 ConverterParameter 때문에 할 수없는이 DependencyObject에하지 않고 바인딩 할 수 없습니다 : DataTemplate을

DataSourcesList.Add(new DataSourceWithMappedName<System.Object>() { MappedName = e.PropertyName, SourceList = Enum.GetNames(enumAttribute.EnumerationType) }); 

그리고 변경 .

아마도 열거 형이 아닌 컬렉션 바인딩에 동일한 원칙을 사용해야한다고 말할 것입니다.

일반적인 GridView의 일반 ComboBox 표현에 대한 해결책을 알려주십시오.

Tnx 및 해피 코딩.

답변

1

DataTemplate을 코드로 쉽게 설정하는 것이 좋습니다. 먼저 datatemplate을 정의한 다음의 결과 인 ComboBox ItemSource Binding Source을의 결과 인 List of String으로 설정하십시오.

코드 방법

 // Create template 
     DataTemplate newTemplate = new DataTemplate(); 
     FrameworkElementFactory stackFactory = new FrameworkElementFactory(typeof(StackPanel)); 
     FrameworkElementFactory comboFactory = new FrameworkElementFactory(typeof(ComboBox)); 
     Binding newBinding = new Binding(); 
     newBinding.Source = Enum.GetNames(typeof(enumAttribute.EnumerationType)); 
     comboFactory.SetBinding(ComboBox.ItemsSourceProperty, newBinding); 
     stackFactory.AppendChild(comboFactory); 
     newTemplate.VisualTree = stackFactory; 

     // Set the template 
     templateColumn.CellTemplate = newTemplate; 

XAML/코드 방법 *

<CollectionViewSource x:Key="EnumCollection"/> 

<DataTemplate x:Key="enumTemplate"> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding Source={StaticResource EnumCollection}}" /> 
    </StackPanel> 
</DataTemplate> 

코드 (당신이 Collection Source을 설정해야합니다) :

CollectionViewSource enumCollection = (CollectionViewSource)this.FindResource("EnumCollection"); 
enumCollection.Source =Enum.GetNames(typeof(enumAttribute.EnumerationType)); 

순수 XAML

<ObjectDataProvider x:Key="EnumCollection" 
        MethodName="GetValues" 
        ObjectType="{x:Type sys:Enum}"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="YourEnum" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

<DataTemplate x:Key="enumTemplate"> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding Source={StaticResource EnumCollection}}" /> 
    </StackPanel> 
</DataTemplate> 
+0

훌륭한 솔루션입니다. 옳은 일을하고, 의도 한대로는 아니지만 여전히 효과가 있습니다. XAML 솔루션을 알고 계시거나 아이디어가 있습니까? – nzic

+0

위의 편집을 참조하십시오. –