2016-05-24 5 views
0

Wenn ich eine comboBox meiner Ansicht habe und will ein leeres Element der Lage sein, um die Option zu deaktivieren, verwende ich diesen Code in meiner Sicht:Wie verwendet man eine Eigenschaft des Ansichtsmodells in einer CompositeCollection?

<ComboBox.Resources> 
    <CollectionViewSource x:Key="comboBoxSource" Source="{Binding ElementName=ucPrincipal, Path=DataContext.MyProperty}" /> 
</ComboBox.Resources> 
<ComboBox.ItemsSource> 
    <CompositeCollection> 
     <entities:MyType ID="-1"/> 
     <CollectionContainer Collection="{Binding Source={StaticResource comboBoxSource}}" /> 
    </CompositeCollection> 
</ComboBox.ItemsSource> 

In diesem Fall ist die Ansicht ist, die die ID-Sets -1 um anzuzeigen, dass es sich um einen speziellen Gegenstand handelt. Aber ich mag diese Lösung nicht so sehr, weil das Ansichtsmodell davon abhängt, ob die Ansicht es richtig setzt. Ich denke diese Eigenschaft meiner Meinung nach Modell haben

Also:

public readonly MyType MyNullItem = new MyType(); 

Aber ich weiß nicht, wie es in der Ansicht in meiner Verbund Sammlung verwenden statt:

<entities:MyType ID="-1"/> 

Ist es möglich?

Danke.

Antwort

1

Sie benötigen einen bindenden Konverter, der eine Liste und ein Objekt in CompositeCollection kombiniert. Vor einiger Zeit implementiert ich Ähnliche Wandler mit Unterschieden, dass es mehrere Sammlungen in einem konvertiert:

/// <summary> 
/// Combines multiple collections into one CompositeCollection. This can be useful when binding to multiple item sources is needed. 
/// </summary> 
internal class MultiItemSourcesConverter : IMultiValueConverter { 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { 
     var result = new CompositeCollection(); 

     foreach (var collection in values.OfType<IEnumerable<dynamic>>()) { 
      result.Add(new CollectionContainer { Collection = collection }); 
     } 
     return result; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { 
     throw new NotSupportedException(); 
    } 
} 

Und Verwendung solchen Wandlers sieht wie folgt in XAML:

<ComboBox.ItemsSource> 
    <MultiBinding Converter="{StaticResource MultiItemSourcesConverter}"> 
     <Binding Path="FirstCollection" /> 
     <Binding Path="SecondCollection" /> 
    </MultiBinding> 
</ComboBox.ItemsSource> 
Verwandte Themen