【问题标题】:How do you get a Combobox to set a value of null when bound to 'SelectedItem'?当绑定到“SelectedItem”时,如何让 Combobox 设置 null 值?
【发布时间】:2018-10-23 12:33:33
【问题描述】:

我有一个组合框,我在开头添加了<x:Null/>,因为“null”是绑定属性的完全有效值,但 WPF 似乎不愿意设置它。这是 XAML:

<ComboBox SelectedItem="{Binding PropertyName}">
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <x:Null/>
            <CollectionContainer Collection="{Binding (available items)}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name, FallbackValue='(None)'}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

(available items) 中的集合包含具有Name 属性的对象。当PropertyName 的当前值为空时,组合框正确显示(None),并且当我选择一个时它设置为集合中的一个项目,但是当我选择(None) 时,它不会将属性设置为空。有什么办法可以让它做到这一点?

【问题讨论】:

标签: c# wpf


【解决方案1】:

我最近遇到了这个问题......解决这个问题的一种方法是拥有一个可以公开空值属性的视图模型:

public class ListItemValue<T>
{
   public ListItemValue(string name, T value)
   {
      Name = name;
      Value = value;
   }

   public string Name { get; }

   public T Value { get; }
}

【讨论】:

    【解决方案2】:

    &lt;x:Null&gt; 替换为某事物的实际实例并使用转换器:

    public class Converter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => value;
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
            value is short ? null : value;
    }
    

    XAML:

    <ComboBox>
        <ComboBox.SelectedItem>
            <Binding Path="PropertyName">
                <Binding.Converter>
                    <local:Converter />
                </Binding.Converter>
            </Binding>
        </ComboBox.SelectedItem>
        <ComboBox.ItemsSource>
            <CompositeCollection xmlns:sys="clr-namespace:System;assembly=mscorlib">
                <sys:Int16 />
                <CollectionContainer Collection="{Binding Source={StaticResource items}}"/>
            </CompositeCollection>
        </ComboBox.ItemsSource>
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name, FallbackValue='(None)'}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 2019-11-10
      • 1970-01-01
      • 2020-01-24
      • 2014-10-10
      • 2011-03-16
      • 2011-11-01
      • 2016-03-25
      相关资源
      最近更新 更多