Ich habe 3 Comboboxen, die an ein Objekt mit der Bezeichnung ARDAR
mit den Eigenschaften ARFlag
, DARFlag
und ConfirmedFlag
gebunden sind. Wenn ein Flag aus einer ComboBox
ausgewählt wird, wird seine ID in den Einstellungen gespeichert (Properties.Settings.Default.ARFlag = aRFlag.flag1;
).Mit MVVM (C# WPF) wie zeigen Sie Einstellungen bei der App-Initialisierung in ihre jeweiligen Steuerelemente?
Wenn die Anwendung gestartet wird, wird über das XAML eine Instanz des ARDAR
Objekts erstellt. Der Konstruktor für das Objekt überprüft die Einstellungen für einen Nicht-Null-Wert und aktualisiert die Eigenschaft, wenn es einen Wert (if (Properties.Settings.Default.ARFlag != 0) ARFlag = sa.flags.Where(f => f.flag1 == Properties.Settings.Default.ARFlag).FirstOrDefault();
)
Dies löst die OnPropertyChanged
Methode, die ich dachte, würde die Comboboxen aktualisieren, um dann für die die Auswahl zeigen gespeicherte Einstellung. Nach dem Initialisieren der Anwendung bleiben die Comboboxen jedoch leer. Ich stellte sicher, dass die Eigenschaften von ARDAR
tatsächlich zu ihren jeweiligen Einstellungen geändert werden und dass OnPropertyChanged
tatsächlich feuert. Also, was vermisse ich? Wie kann ich die ComboBoxen ihre gespeicherten Einstellungen anzeigen lassen?
Hier ist meine XAML & C# -Code:
public class ARDAR : INotifyPropertyChanged
{
public ARDAR()
{
var sa = new SALinqDataContext();
if (Properties.Settings.Default.ARFlag != 0) ARFlag = sa.flags.Where(f => f.flag1 == Properties.Settings.Default.ARFlag).FirstOrDefault();
if (Properties.Settings.Default.DARFlag != 0) DARFlag = sa.flags.Where(f => f.flag1 == Properties.Settings.Default.DARFlag).FirstOrDefault();
if (Properties.Settings.Default.ConfirmedFlag != 0) ConfirmedFlag = sa.flags.Where(f => f.flag1 == Properties.Settings.Default.ConfirmedFlag).FirstOrDefault();
}
flag aRFlag;
flag dARFlag;
flag confirmedFlag;
public flag ARFlag
{
get
{
return aRFlag;
}
set
{
aRFlag = value;
OnPropertyChanged("ARFlag");
Properties.Settings.Default.ARFlag = aRFlag.flag1;
Properties.Settings.Default.Save();
}
}
public flag DARFlag
{
get
{
return dARFlag;
}
set
{
dARFlag = value;
OnPropertyChanged("DARFlag");
Properties.Settings.Default.DARFlag = dARFlag.flag1;
Properties.Settings.Default.Save();
}
}
public flag ConfirmedFlag
{
get
{
return confirmedFlag;
}
set
{
confirmedFlag = value;
OnPropertyChanged("ConfirmedFlag");
Properties.Settings.Default.ConfirmedFlag = confirmedFlag.flag1;
Properties.Settings.Default.Save();
}
}
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
und die relevanten XAML:
<Window.Resources>
<luke:ARDAR x:Key="ARDAR"/>
<luke:ocSAFlags x:Key="ocSAFlags" />
</Window.Resources>
<TabControl>
<TabItem Header="Retention">
<TabControl>
<TabItem Header="Renewals">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ToolBar Grid.Row="0">
<StackPanel Orientation="Horizontal" DataContext="{StaticResource ARDAR}">
<Label Content="AR Flag" />
<ComboBox Width="120"
ItemsSource="{StaticResource ocSAFlags}"
DisplayMemberPath="flag_desc"
SelectedItem="{Binding ARFlag}"
/>
<Label Content="DAR Flag" />
<ComboBox Width="120"
ItemsSource="{StaticResource ocSAFlags}"
DisplayMemberPath="flag_desc"
SelectedItem="{Binding DARFlag}" />
<Label Content="Conf Flag" />
<ComboBox Width="120"
ItemsSource="{StaticResource ocSAFlags}"
DisplayMemberPath="flag_desc"
SelectedItem="{Binding ConfirmedFlag}"/>
</StackPanel>
</ToolBar>
</Grid>
</TabItem>
</TabControl>
</TabItem>
</TabControl>
Edit: Ich sollte auch den Code zeigen, dass ocSAFlags
in Fall-Feeds, die zu einer Lösung relevant ist.
public class ocSAFlags : ObservableCollection<flag>
{
public ocSAFlags()
{
var sa = new SALinqDataContext();
var flags = sa.flags.Where(f => f.available == true)
.OrderBy(f => f.flag_desc);
foreach (flag f in flags) Add(f);
}
}
SelectedItem = "{Binding ARFlag, Mode = TwoWay}" – Steve
@Steve Guter Gedanke, aber das hat nicht funktioniert. Ich denke, der Grund, warum es nicht aktualisiert wird, ist, weil die UI-Sachen noch nicht geladen sind, wenn OnPropertyChanged aufgerufen wird. Ich kann mir einfach keinen Workaround dafür vorstellen. –
Jetzt weiß ich sicher, dass die UI noch nicht geladen ist, wenn 'OnPropertyChanged' aufgerufen wird, weil ich versucht habe, eine statische Klasse für' ocSAFlags' zu verwenden mit der Idee, dass das 'SelectedItem' von der eigentlichen Sammlung kommen muss Sammlung an die ItemsSource gebunden. Ich weiß immer noch nicht die Antwort auf das, aber ich habe festgestellt, dass ich einen Fehler "kein Konstruktor" wegen der statischen Klasse nach der OnPropChange ausgeführt wurde. Immer noch fest. –