2014-03-04 97 views
1

我需要让几个项目的选择,从这个预设列表:如何将数据绑定到集合中的组合对象的属性?

public enum QuarkType{ 
    Up, 
    Down, 
    [Description("Magical Being")] Charm, 
    [Description("Quite Odd")] Strange, 
    Top, 
    Bottom 
} 

于是我就用CheckComboBox,并使用DescriptionAttribute,我需要使用自定义的描述。我喂CheckComboBox使用MarkupExtension返回给定enumIEnumerable<EnumDescriptionPair>,其中EnumDescriptionPair是所有值的列表:

public class EnumDescriptionPair{ 
    public object Value { get; set; } 
    public string Description { get; set; } 
} 

现在的问题是如何将Value s此列表的传递给后台代码清单:

public ObservableCollection<QuarkType> SelectedQuarksList { get; set; } 

我的意思是,如何把刚ValueEnumDescriptionPair的选定列表中的每个项目?

这是我到目前为止。这显然是行不通的(这意味着它显示了CheckComboBox正确的字符串,并允许选择几个项目,但没有反映在上面提到的SelectedQuarksList):

<Window x:Class="MyEditor.MainWindow" 
     xmlns:loc="clr-namespace:MyEditor" 
     xmlns:toolKit="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

    <StackPanel> 
     <toolKit:CheckComboBox x:Name="Ccb" Delimiter="," 
           ItemsSource="{loc:EnumItemsValueConverter {x:Type loc:QuarkType}}" 
           DisplayMemberPath="Description" 
           SelectedItemsOverride="{Binding SelectedQuarksList}" /> 

     <ListBox ItemsSource="{Binding SelectedQuarksList}" /> 
    </StackPanel> 
</Window> 
+0

由于列表是预定义的,复选框列表是否需要绑定?我之前已经完成了所有在XAML中声明的选项,并绑定到一个Enum,但不是你描述的方式。 +1是一个很好的问题。 – BradleyDotNET

+0

@LordTakkera - 我不确定我是否理解你的建议,但我愿意提供建议 – Tar

+0

我在解答我的建议的尝试在我的答案中,希望它们对你有用。 – BradleyDotNET

回答

0

做你的问题问什么,您可以尝试在SelectedQuarksList绑定中使用ConvertBack函数中执行“.Select(q => q.Value)”的转换器。

为了得到你想要的行为,我已经在过去成功完成了这个工作(例子中有2个值),这将枚举设置为“Flags”,所以值序列变为0,1,2,4。 ..:

<StackPanel Orientation="Horizontal"> 
<Checkbox Content="Up" IsChecked="{Binding Path=SelectedQuarksFlags, Converter={Static Resource HasFlagToBoolConverter}, ConverterParamater={x:Static Quarks.Up}}" 
<Checkbox Content="Magical Being" IsChecked="{Binding Path=SelectedQuarksFlags, Converter={Static Resource HasFlagToBoolConverter}, ConverterParamater={x:Static Quarks.Charm}}" 
</StackPanel> 

转换器看起来像:

Quark _lastSeenValue; 
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Quark paramQuark = (Quark)parameter; 
     Quark currentQuark = (Quark)value; 

     _lastSeenValue = currentQuark; 
     return currentQuark.HasFlag(paramQuark); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Quark newQuark = _lastSeenValue; 
     Quark paramQuark = (Quark)parameter; 

     if ((bool)value) 
     { 
      newQuark |= paramQuark; 
     } 
     else 
     { 
      newQuark &= ~paramQuark; 
     } 

     _lastSeenValue = newQuark; 
     return newQuark; 
    } 

这可以转换为添加或从列表中相对容易删除,但我知道上述工程的代码。

+0

你上面的'XAML'代码应该进入'CheckComboBox .ItemTemplate'标签? – Tar

+0

但现在我想我理解你对我的问题的评论......那么答案就是这个'enum'是定义的瞬态 - 整个想法是我们可以在未改变代码的情况下改变它 – Tar

+0

不,你没有在我的XAML例子中有一个项目模板,因为它看起来像你想象的那样。至于改变它,除非它是数据驱动的,否则你将会改变代码:)。那就是说,你是否尝试过使用转换器.Select? – BradleyDotNET

相关问题