2014-03-04 157 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

相關問題