2014-10-30 133 views
4

我正在使用Xceed checkable combobox。现在我想显示一个默认文本,取决于组合框中选中的复选框,但我不知道该怎么做。可选组合框的默认文本

例如:

enter image description here

文本框的内容(红色箭头)应该是:

  • 如果没有选择: “请选择”
  • 如果一切都被选中:“所有人”
  • 如果一个或多个被选择: “特定选择”

喜欢:

enter image description here


例-代码:

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <xctk:CheckComboBox x:Name="_checkComboBox" 
          Height="22" 
          VerticalAlignment="Stretch" 
          ItemsSource="{Binding Names}" 
          SelectedItemsOverride="{Binding SelectedNames}" 
          DisplayMemberPath="Title" 
          Delimiter=", " 
          Width="100"/> 
    </Grid> 
</Window> 

CS:

using System.Windows; 

namespace WpfApplication1 
{ 
    using System.Collections.ObjectModel; 

    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      _checkComboBox.DataContext = this; 

      Names = new ObservableCollection<People>() 
       { 
       new People() { Title = "Mikel" }, 
       new People() { Title = "Tom" }, 
       new People() { Title = "Jennifer" }, 
       new People() { Title = "Megan" }, 
       }; 

      SelectedNames = new ObservableCollection<People>(); 
     } 

     public ObservableCollection<People> Names 
     { 
      get; 
      set; 
     } 

     public ObservableCollection<People> SelectedNames 
     { 
      get; 
      set; 
     } 
    } 

    public class People 
    { 
     public string Title 
     { 
      get; 
      set; 
     } 
    } 
} 
+1

点我们默认的样式模板或右键单击 - 拉出>编辑模板,组合框的通常只是一个切换按钮和排序的一个ItemsControl,可以在切换按钮的内容部分抛出一些触发器并获得您的解决方案。 – 2014-10-30 17:57:11

回答

5

使用值转换器。

像这样的东西应该工作:

XAML:

SelectedItemsOverride="{Binding SelectedNames, 
         Converter={StaticResource SelectedNamesConverter}}, 
         ConverterParameter={Binding Names}}" 

C#:

public class SelectedNamesConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if ((List<string>)value.length() == 0): 
      return "Please select"; 

     if (((List<string>)value).length() == ((List<string>)parameter).length()) 
      return "All people"; 

     return "Specific selection"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Log this as a non-fatal error. You shouldn't be here! 
     return DependencyProperty.UnsetValue; 

     // Alternatively: 
     // throw new NotImplementedException(); 
    } 
} 

而且使名称的依赖项属性:

public static DependencyProperty NamesProperty = DependencyProperty.Register(
     "Names", 
     typeof(ObservableCollection<People>), 
     typeof(MainWindow)); 

    public ObservableCollection<People> Names 
    { 
     get { return (ObservableCollection)GetValue(NamesProperty); } 
     private set { SetValue(NamesProperty, value); } 
    } 

制作主窗口继承德普endencyObject:

public class MainWindow : DependencyObject 
+0

我收到此错误:无法在'Binding'类型的'ConverterParameter'属性上设置'绑定'。 '绑定'只能在DependencyObject的DependencyProperty上设置。 – Stampy 2014-11-04 09:05:42

+0

@Stampy我做了一些编辑。试试吗? – Zaaier 2014-11-04 09:13:37

+0

我试过了,但是:名称“SetValue”在currect上下文中不存在(与GetValue相同) – Stampy 2014-11-04 09:20:25