WPF ComboBox를 MyEnum 유형의 nullable 속성에 바인딩하고 있습니까? 에서 또한Nullable 값을 WPF ComboBox에 바인딩 할 때의 문제
// The enum type being bound to
enum MyEnum { Yes, No }
// Helper class for representing combobox listitems
// (a combination of display string and value)
class ComboItem {
public string Display {get;set}
public MyEnum? Value {get;set}
}
private void LoadComboBoxItems()
{
// Make a list of items to load into the combo
var items = new List<ComboItem> {
new ComboItem {Value = null, Display = "Maybe"},
new ComboItem {Value = MyEnum.Yes, Display = "Yes"},
new ComboItem {Value = MyEnum.No, Display = "No"},};
// Bind the combo's items to this list.
theCombo.ItemsSource = items;
theCombo.DisplayMemberPath = "Display";
theCombo.SelectedValuePath = "Value";
}
코드 숨김, 나는 속성 클래스의 인스턴스에 DataContext를 설정하고있다 :
내가 프로그래밍과 같은 콤보 상자 항목을 채우는하고 (여기서 MyEnum이 열거 타입입니다) MyEnum 유형의 TheNullableProperty (이 예제의 경우 어쨌든)를 호출합니다.
Combo의 SelectedValue 바인딩은 내 XAML 파일에서 수행됩니다.
<ComboBox
Name="theCombo"
SelectedValue="{Binding Path=TheNullableProperty,
UpdateSourceTrigger=PropertyChanged}"/>
는 문제 :
바인딩 된 속성의 값이 처음에 null이 아닌, 콤보 상자가 제대로 값을 표시합니다.
그러나 바인딩 된 속성의 값이 처음 null이면 콤보 상자가 비어 있습니다.
콤보 상자가 처음 표시 될 때 데이터 바인딩의 모든 측면이 null 값의 표현과는 별도로 작동하는 것처럼 보입니다.
예를 들어, 드롭 다운에서 어쩌면을 선택할 수 있으며 바운드 속성이 null로 올바르게 설정됩니다. 실패한 초기 로딩 일뿐입니다. 어쩌면 난 그냥 수동으로 내가 결국 무엇
는에 null 허용 열거에서 변환하는 변환기를 통해 기본 null 허용 열거 값에 숨겨진 된 본체의 데이터 바인딩을 추가- 을하는 ... 처음 SelectedValue를 설정해야 string (enum.ToString 또는 "null").
- 콤보 상자에 문자열 레이블 (콤보로 표시)과 열 (문자열 값)을 문자열 (null 값의 경우 "null")과 동일한 값을 갖는 'ComboItems'로로드하십시오.
콤보 상자를 텍스트 블록에 데이터 바인딩합니다.
/// <summary> /// Convert from EnumeratedType? to string (null->"null", enum values->ToString) /// </summary> public class EnumConverter<T> : IValueConverter where T:struct { public static string To(T? c) { if (c == null) return "null"; return c.ToString(); } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return To((T?)value); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var s = (string) value; if (s == "null") return null; return (T?)Enum.Parse(typeof(T), s); } } public class MyEnumConverter : EnumConverter<MyEnum> { } public class ComboItem { public string Value { get; set; } public string Label { get; set; } public ComboItem(MyEnum? e, string label) { Value = MyEnumConverter.To(e); Label = label; } } static IEnumerable<ComboItem> GetItems() { yield return new ComboItem(null, "maybe"); yield return new ComboItem(MyEnum.Yes, "yup"); yield return new ComboItem(MyEnum.No, "nope"); } private void SetupComboBox() { thecombo.ItemsSource = GetItems().ToList(); }
ItemsControls의 경우 null이 특별한 값이라고 생각합니다. 변환기를 제공하는 한 TextBlock에 null을 바인딩 할 수 있습니다. A 변환기는 ItemsControls가 선택한 항목으로 null을 허용하도록 AFAICS를 만드는 데 도움이되지 않습니다. – mackenir