1

我有一个绑定的 WPF 组合框,它的 ItemsSource 设置为 CompositeCollection。我正在尝试这样做并适应在“常规”对象的 ObservableCollection 之前添加 <Select> 和 <Add New...> 选择。我不知道如何在代码隐藏中选择这些添加的选项之一。

这就是我构建 CompositeCollection 的方式:

private CompositeCollection CreateItemsSource(ObservableCollection<T> source)
{
  CompositeCollection cmpc = new CompositeCollection();

  cmpc.Add(new ComboBoxItem { Content = "<Select>" });
  cmpc.Add(new ComboBoxItem { Content = "<Add New...>" });

  var cc1 = new CollectionContainer { Collection = source };
  cmpc.Add(cc1);

  return cmpc;
}

这是 ComboBox 的样子:

<DataTemplate x:Key="LookupComboTemplate">
  <TextBlock Text="{Binding}"/>
</DataTemplate>

  <ComboBox ItemsSource="{Binding SubCategories.ItemsSource}" 
            ItemTemplate="{StaticResource LookupComboTemplate}">
    <ComboBox.SelectedItem>
      <Binding Path="SourceData.SubCategoryObj" Mode="TwoWay"></Binding>
    </ComboBox.SelectedItem>
  </ComboBox>

我遇到了 SelectedItem SourceData.SubCategoryObj 为 null 的情况(它是一个可选属性)。在这种情况下,我想手动选择并显示 <Select> 选项。但是无论我做什么(设置 SelectedIndex 被忽略,将 SelectedValue 设置为 CompositeCollection 中的 ComboBoxItem 被忽略)我在渲染时都会得到一个空白的 ComboBox。

我将不胜感激有关如何做到这一点的任何建议。

谢谢!科里。

4

1 回答 1

1

您应该能够使用自定义值转换器为您的 SelectedItem 绑定解决此问题。http://wpftutorial.net/ValueConverters.html应该给你一些指示。

我不确定combox是否需要一个简单的字符串或一些复合对象,但你可以检查一下。就像是

public class ComboConverter: IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return "<Select>";
        return value;
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.toString().Equals("<Select>")
            return null;
        return value;
    }

如果所选项目为空,则应为您提供“<Select>”条目。

于 2013-06-04T21:52:20.790 回答