2016-07-08 10 views
1

Nehmen wir an, ich habe ein Wörterbuch und ich möchte Elemente aus diesem Wörterbuch an einige Steuerelemente binden, und ich möchte nach Elementschlüssel binden.Bindung mit Wörterbuch Element nach Schlüssel

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     Dictionary<string,string> dictionary = new Dictionary<string,bool>(); 

     dictionary.Add("Item 1", "one"); 
     dictionary.Add("Item 2", "two"); 
     dictionary.Add("Item 3", "three"); 
     // ... 
     dictionary.Add("Item 99", "ninety nine"); 

     // ... 

     this.DataContext = //... 
    } 
} 

XAML:

<Window ... > 
    <Grid> 
     <Label Content="{Binding ...}"/><!-- "Item 1" --> 
     <TextBox Text="{Binding ...}"/><!-- "Item 3" --> 

     <StackPanel> 
      <CustomControl CustomProperty="{Binding ...}"/><!-- "Item 77" --> 
      <CustomControl2 CustomProperty="{Binding ...}"/><!-- "Item 99" --> 
     </StackPanel> 
    </Window> 

Ist es möglich? Wie kann ich es tun?

Ich möchte Wörterbuch (oder etwas Sililar) verwenden.

Mein Wörterbuch mit Variablen kommt aus der Datenbank und ich habe etwa 500 Variablen zu binden.

Diese Variablen sind nicht wie "Liste der Personen" oder so ähnlich. Sie haben eine sehr unterschiedliche Bedeutung und ich möchte sie als "dynamische Eigenschaften" verwenden.

Ich muss jede Variable mit jeder Eigenschaft eines beliebigen Steuerelements binden.

Antwort

1
<ItemsControl x:Name="dictionaryItemsControl" ItemsSource="{Binding dictionary}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Key}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Dafür sollten Sie 'Wörterbuch' öffentliches Eigentum machen, und setzen this.DataContext = this; oder setzen alternativ dictionaryItemsControl.ItemsSource = dictionary;

+0

Ich glaube, ich nicht Datenvorlage wie diese verwenden können. Tatsächlich sind meine Steuerelemente nicht nur Etiketten. Ich habe meine XAML für diese Frage zu sehr vereinfacht. Ich aktualisiere es. – Kamil

+0

@Kamil Sie denken? Was ist Ihre genaue Anforderung, posten Sie es bitte. – AnjumSKhan

0

Sie

CASE # 1

C# -Code verwenden können:

public partial class MainWindow : Window 
{ 
    Dictionary<string, object> _data = new Dictionary<string, object>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     Loaded += new RoutedEventHandler(MainWindow_Loaded); 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 

     _data["field1"] = 100; 
     _data["field2"] = "Pete Brown"; 
     _data["field3"] = new DateTime(2010, 03, 08); 

     this.DataContext = new DicVM(); 

    } 
} 
Die Bindung

XAML:

<TextBlock Text="{Binding [field1], Mode=TwoWay}" /> 

CASE # 2

C# Code: DicViewModel.cs

class DicViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private Dictionary<string, object> dict = new Dictionary<string, object>(); 

    public Dictionary<string, object> Dict 
    { 
     get { return dict; } 
     set 
     { 
      dict = value; 
      if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Dict")); 
     } 
    } 

    public DicVM() 
    { 
     Dict["field1"] = 100; 
     Dict["field2"] = "Pete Brown"; 
     Dict["field3"] = new DateTime(2010, 03, 08); 
    } 

} 

C# Code of Dic.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Loaded += new RoutedEventHandler(MainWindow_Loaded); 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = new DicViewModel(); 
    } 
} 

XAML Bindung:

<TextBlock Text="{Binding Dict[field1], Mode=TwoWay}" /> 
+0

Dieses Ansichtsmodell benachrichtigt Steuerelemente, wenn ich einen Wert im Wörterbuch aktualisiere oder wenn ich einen neuen Eintrag hinzufüge? – Kamil

+0

@Kamil - Fall Nr. 2 aktualisiert den Wert. In diesem Fall verwende ich ** 'INotifyPropertyChanged' **. –

Verwandte Themen