2014-05-19 2 views
1

다음과 같은 일련의 속성을 가진 클래스 세트가 있습니다. 가능한 각 값을 나타낼 수있는 사용자 정의 속성을 갖는 각각의 요소. 어쨌든 <ComboBoxItem/>을 사용하여 하드 코드 대신 콤보 상자에이 값을 데이터 바인딩하는 방법이 있습니까?콤보 박스에 대한 데이터 바인딩 속성 값

[Values("Cash","Bank","Not Applicable")] 
public Nullable<int> PaymentMethod{ get; set; } 

편집 :이

class ValuesAttribute:Attribute 
{ 
    public List<string> values { get; set; } 
    public ValuesAttribute(params String[] values) 
    { 
     this.values= new List<string>(); 
     foreach (var v in values) 
     { 
      this.values.Add(v); 
     } 
    } 
} 

답변

1

내가 이것에 대한 변환기를 사용하는 것처럼 내 특성을 보인다. 기본 객체와 속성 이름을 매개 변수로 보냅니다. 당신이 값 (인덱스/열거 값) 및 표시 텍스트를 모두 결합 할 수 있도록 키/값의 배열을 돌려줍니다 :

<ComboBox ItemsSource="{Binding ConverterParameter='PaymentMethod',Converter={StaticResource AttributeConverter}}" 
      DisplayMemberPath="Value" SelectedValuePath="Key" 
/> 

다음 반사 사용하여 값을 얻을 수있는 컨버터 :

public class AttributeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null && parameter as string != null) 
     { 
      var property = value.GetType().GetProperty((string)parameter); 
      if (property != null) 
      { 
       var attribute = property.GetCustomAttributes(typeof(ValuesAttribute), false).OfType<ValuesAttribute>().FirstOrDefault(); 
       if (attribute != null) 
        return attribute.values.Select((display, index) => 
         new KeyValuePair<int, string>(index, display) 
         ).ToArray(); 
      } 
     } 
     return DependencyProperty.UnsetValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

참고 : 응용 프로그램에서이 작업을 많이 수행해야하는 경우 ComboBox를 서브 클래 싱하거나 관련 속성을 적용하는 비헤이비어를 만드는 것이 유용 할 수 있습니다.

+0

감사합니다. 이것을 확인하기 위해 약간의 시간이 필요합니다. – gawicks

관련 문제