2012-04-03 12 views
1

Ich habe eine ComboBox an eine Sammlung von Objekten gebunden, die als diese definiert sind.Machen Sie nur eine von vielen Steuerelementen basierend auf dem Wert eines anderen Steuerelements sichtbar

public class TierOption 
{ 
    public string Option { get; set; } 
    public Type DataType { get; set; } 
} 
public class TierOptions : ObservableCollection<Tier1Option> 
{ 

} 

Ich habe 3 andere zu dieser ComboBox bezogenen Kontrollen, die eine TextBox, ComboBox sind, oder ein WPFToolkit: Datepicker.

Ich muss nur das zugehörige Steuerelement anzeigen, das dem Datentyp (Type) des in der ersten ComboBox ausgewählten Objekts und keinem der anderen entspricht.

Pseudo-Code Beispiel: (wahrscheinlich zu nah # zu schlachten C aber hoffentlich vermittelt es die Idee)

switch (ComboBox.SelectedItem.DataType) 
{ 
    case String: 
      TextBox.Visibility = Visibility.Visible; 
      ComboBox.Visibility = Visibility.Hidden; 
      DatePicker.Visibility = Visibility. Hidden; 
    break; 
    case DateTime: 
      TextBox.Visibility = Visibility.Hidden; 
      ComboBox.Visibility = Visibility.Hidden; 
      DatePicker.Visibility = Visibility. Visible; 
    break; 
    <...so forth and so on...> 
} 

Meine Versuche sind in sehr Nicht-wpf sucht gewundene Verwirrungen geführt, die unabhängig funktioniert nicht. Da ich neu bei WPF bin, bemühe ich mich sehr, den besten Designpraktiken treu zu bleiben.

Vielen Dank!

Antwort

4

Sie können mit Datatemplate mit Datatype-Eigenschaft spielen

<...Resources> 
    <DataTemplate DataType="{x:Type sys:String}"> 
     <TextBox Text="{Binding}"/> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type DateTime}"> 
     <DatePicker .../> 
    </DataTemplate> 
    ... 
</...Resources> 

<ContentControl Content="{Binding SelectedItem, ElementName=myComboBox}"/> 

<ComboBox ItemsSource="{Binding ...}"/> 

Der obige Code ist nur die Idee, könnten Sie adjustements machen. Beispielsweise können Sie ein Zeichenfolgenelement selbst nicht ändern (Sie müssen möglicherweise alle Elemente Ihrer Liste verkapseln).

Wenn Ihre Liste alle Elemente desselben Typs enthält, können Sie einen ContentTemplateSelector auf contentControl verwenden.

ContentControl Content="{Binding SelectedItem, ElementName=YourCombBox}" ContentTemplateSelector="{StaticResource YourTemplateSelector}" 

MSDN DOC about ContentControl.ContentTemplateSelector Property

+0

+1 Ich denke, diese Idee ist besser als meine ursprüngliche Idee, Trigger zu verwenden. Wenn die Anzahl der Kontrollen zunimmt, würden Auslöser das Problem erschweren. Mit verschiedenen Datatemplates ist es möglich, imho zu gehen, da es später einfach ist, weitere Controls hinzuzufügen. – dowhilefor

+0

Das sieht für mich so aus, als würde es funktionieren, wenn jedes Objekt in der ersten ComboBox einen bestimmten Typ hätte, aber jedes Objekt vom selben Typ (TierOption) ist, der eine Eigenschaft hat, die DataType definiert. Versteh ich etwas falsch? – elo

+0

@elo Sorry, du hast Recht! Ich lese zu schnell, daher muss für jede Art von Option, die Sie in Ihre Liste eingeben, eine Klasse erstellt werden (die von TierOption erbt). – Jonas

0

binden an die Detail Sichtbarkeit Element = ComboBox Path = SelectedItem.DataType. Und Sie müssen einen Konverter verwenden, der Sichtbarkeit zurückgibt. Sie benötigen zwei Konverter, die entgegengesetzte Antworten zurückgeben. Wenn Sie mehr als 2 Kombination haben, dann mehr in der Linie von Jonas.

Ich nahm an, Type war eine Systemklasse und es scheint eine benutzerdefinierte Klasse zu sein. Erweitern Sie diese Klasse, um zusätzliche Eigenschaften zu erhalten. Selbst wenn Type ein Systemtyp wäre, könnten Sie einfach eine Klasse erstellen, die es implementiert und erweitert.

public Visibility TextBoxVisibility { get; } 
    public Visibility ComboBoxVisibility { get; } 
    ... 

    Then on TextBox bind the visibility 

    Visisbility="{binding ElementName=Combobox Path=SelectedItem.DataType.TextBoxVisibility]"; 
Verwandte Themen