WPF使用CompositeCollection绑定ComboBox - 设置SelectedItem

时间:2013-06-04 21:42:28

标签: wpf wpf-controls

我有一个绑定的WPF comboBox,其ItemsSource设置为CompositeCollection。我正在尝试这样做以适应添加< Select>和<添加新...>在“常规”对象的ObservableCollection之前的选择。我无法弄清楚如何在代码隐藏中选择其中一个添加的选项。

这就是我构建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(它是一个可选属性)。在这种情况下,我想手动选择并显示&lt; Select&gt;选择。但无论我做什么(设置SelectedIndex被忽略,将CompositeValue设置为CompositeCollection中的ComboBoxItem被忽略)我在渲染时得到一个空白的ComboBox。

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

谢谢! 科里。

1 个答案:

答案 0 :(得分:1)

您应该能够使用SelectedItem绑定的自定义valueconverter来解决此问题。 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;
    }

应该为您提供“&lt; Select&gt;”如果所选项目为空,则输入。