/ / Rilegatura con voce di dizionario per chiave - wpf, dizionario, rilegatura

Legatura con voce del dizionario per chiave - wpf, dizionario, binding

Diciamo che ho qualche dizionario e voglio associare elementi da questo dizionario ad alcuni controlli e voglio associare per chiave oggetto.

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>

È possibile? Come posso farlo?

Voglio usare il dizionario (o qualcosa di stupido).

Il mio dizionario con variabili proviene dal database e ho circa 500 variabili da associare.

Queste variabili non sono come "elenco di persone" o qualcosa del genere. Hanno un significato molto diverso e voglio usarli come "proprietà dinamiche".

Ho bisogno di associare qualsiasi variabile con qualsiasi proprietà di qualsiasi controllo.

risposte:

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

Per questo dovresti rendere "dizionario" di proprietà pubblica e impostare this.DataContext = this; o in alternativa impostato dictionaryItemsControl.ItemsSource = dictionary;


0 per risposta № 2

Puoi usare

CASO 1

Codice C #:

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();

}
}

Rilegatura XAML:

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

CASO # 2

Codice C #: 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);
}

}

Codice C # di 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();
}
}

Rilegatura XAML:

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