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}" />