2017-02-02 1 views
1

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); 
    } 
} 
+1

SelectedItem = "{Binding ARFlag, Mode = TwoWay}" – Steve

+0

@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. –

+0

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. –

Antwort

0

Das Problem, das die ComboBox von Anzeigen von Informationen zu stoppen war am Ende nichts mit dem zu tun, in der die Dinge laden, wie das Programm initialisiert. Das eigentliche Problem war, dass mein XAML eine Instanz ocSAFlags instanziiert, die die ComboBox auffüllt, und wenn ARDAR initialisiert und setzt den Wert (flag) der gebundenen Eigenschaften sind diese Werte gleichwertig, aber nicht die gleichen tatsächliche flag. Also, meine Lösung tatsächlich am Ende zu ocSAFlags als Static Class, und damit eine Eigenschaft als die ItemsSource für die sowie die 'source' für die linq-Abfrage, die die flag für die gespeicherte ID in die Einstellungen.

XAML: Ich habe die Zeile <luke:ocSAFlags x:Key="ocSAFlags" /> aus Ressourcen entfernt. Ich änderte ItemsSources: ItemsSource="{Binding Source={x:Static luke:ocSAFlags.OCFlag},Mode=OneWay}"

Und hier ist die statische Klasse:

public static class ocSAFlags 
{ 
    static private ObservableCollection<flag> oCFlag = getSAFlags(); 

    private static ObservableCollection<flag> getSAFlags() 
    { 
     var x = new ObservableCollection<flag>(); 
     var sa = new SALinqDataContext(); 
     var flags = sa.flags.Where(f => f.available == true) 
         .OrderBy(f => f.flag_desc); 
     foreach (flag f in flags) x.Add(f); 
     return x; 
    } 

    public static ObservableCollection<flag> OCFlag 
    { 
     get 
     { 
      return oCFlag; 
     }  
    } 
} 
Verwandte Themen