Kann ich in WPF die Bindung mit den in den Einstellungen definierten Werten verwenden? Wenn dies möglich ist, geben Sie bitte ein Muster an.
Antworten:
Zunächst müssen Sie einen benutzerdefinierten XML-Namespace hinzufügen, der den Namespace entwirft, in dem die Einstellungen definiert sind:
xmlns:properties="clr-namespace:TestSettings.Properties"
Greifen Sie dann in Ihrer XAML-Datei mit der folgenden Syntax auf die Standardeinstellungsinstanz zu:
{x:Static properties:Settings.Default}
Hier ist also der endgültige Ergebniscode:
<ListBox x:Name="lb"
ItemsSource="{Binding Source={x:Static properties:Settings.Default},
Path=Names}" />
Quelle: WPF - Wie binde ich ein Steuerelement an eine in den Einstellungen definierte Eigenschaft?
Hinweis: Vergessen Sie nicht, wie von @Daniel und @nabulke ausgeführt, den Zugriffsmodifikator Ihrer Einstellungsdatei auf Public
und den Bereich auf zu setzenUser
MyApp.Properties.Settings.Default.Save()
, muss der Einstellungsbereich auf Benutzer gesetzt werden .
Die obige Lösung funktioniert, aber ich finde sie ziemlich ausführlich ... Sie könnten stattdessen eine benutzerdefinierte Markup-Erweiterung verwenden, die wie folgt verwendet werden könnte:
<ListBox x:Name="lb" ItemsSource="{my:SettingBinding Names}" />
Hier ist der Code für diese Erweiterung:
public class SettingBindingExtension : Binding
{
public SettingBindingExtension()
{
Initialize();
}
public SettingBindingExtension(string path)
:base(path)
{
Initialize();
}
private void Initialize()
{
this.Source = WpfApplication1.Properties.Settings.Default;
this.Mode = BindingMode.TwoWay;
}
}
Weitere Details hier: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/
Die Antwort von @ CSharper funktionierte nicht für meine in VB.NET codierte WPF-Anwendung (nicht C #, im Gegensatz zu anscheinend 99,999% anderer WPF-Anwendungen), da ich einen anhaltenden Compilerfehler erhielt, der sich beschwerte und Settings
nicht im MyApp.Properties
Namespace gefunden werden konnte, der nicht gehen würde auch nach dem Wiederaufbau weg.
Nach langem Suchen im Internet funktionierte stattdessen der local
standardmäßig in der XAML-Datei des Hauptfensters meiner Anwendung erstellte XAML-Namespace:
<Window
<!-- Snip -->
xmlns:local="clr-namespace:MyApp"
<!-- Snip -->
><!-- Snip --></Window>
... und binden Sie sich über die folgenden Einstellungen an meine Einstellungen (wobei dies MyBooleanSetting
eine Einstellung ist, die ich in meinen Projekteigenschaften Typ Boolean
und Bereich Benutzer mit dem Standardmodifikator für den Zugriff auf Freunde definiert habe):
<CheckBox IsChecked="{Binding Source={x:Static local:MySettings.Default}, Path=MyBooleanSetting, Mode=TwoWay}"
Content="This is a bound CheckBox."/>
Rufen Sie an, um sicherzustellen, dass die Einstellungen tatsächlich gespeichert werden
MySettings.Default.Save()
... irgendwo in Ihrem Code-Behind (z. B. im Me.Closing
Ereignis für Ihre MainWindow.xaml.vb
Datei).
(Dank an diesen Visual Studio-Forumsbeitrag für die Inspiration; siehe die Antwort von Muhammad Siddiqi.)
So binde ich die UserSettings:
Generieren Sie eine Abhängigkeitsvariable, indem Sie propdp
zweimal tippen und dann auf die Registerkarte klicken.
public UserSettings userSettings
{
get { return (UserSettings)GetValue(userSettingsProperty); }
set { SetValue(userSettingsProperty, value); }
}
public static readonly DependencyProperty userSettingsProperty =
DependencyProperty.Register("userSettings", typeof(UserSettings), typeof(MainWindow), new PropertyMetadata(UserSettings.Default));
Jetzt können Sie binden userSettings
durch:
Value="{Binding userSettings.SomeUserSettingHere, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Und stellen Sie sicher, dass Sie UserSettings speichern, wenn Sie sie ändern oder beim Beenden durch:
UserSettings.Default.Save();