Binden Sie an einen Wert, der in den Einstellungen definiert ist

78

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.

HB
quelle

Antworten:

130

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 Publicund den Bereich auf zu setzenUser

CSharper
quelle
11
Ich habe festgestellt, dass diese Methode nur funktioniert, wenn die Einstellungsdatei als Modifikator für den öffentlichen Zugriff markiert ist. shortfastcode.blogspot.com/2009/12/…
Daniel
5
Um den Wert mit zu speichern MyApp.Properties.Settings.Default.Save(), muss der Einstellungsbereich auf Benutzer gesetzt werden .
Nabulke
31

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/

Thomas Levesque
quelle
1
Dies ist eine großartige Erweiterung, aber leider verlieren Sie Resharper Intellisense. IMHO den Kompromiss nicht wert, obwohl zu beachten ist, dass ich ein hoffnungsloser R # -Fanboy bin :)
Ohad Schneider
@OhadSchneider, in der Tat. Ich benutze ReSharper selbst, aber selten für XAML, weil ich es nicht so gut finde wie in C # ...
Thomas Levesque
8

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 Settingsnicht im MyApp.PropertiesNamespace gefunden werden konnte, der nicht gehen würde auch nach dem Wiederaufbau weg.

Nach langem Suchen im Internet funktionierte stattdessen der localstandardmäß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 MyBooleanSettingeine Einstellung ist, die ich in meinen Projekteigenschaften Typ Booleanund 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.ClosingEreignis für Ihre MainWindow.xaml.vbDatei).

(Dank an diesen Visual Studio-Forumsbeitrag für die Inspiration; siehe die Antwort von Muhammad Siddiqi.)

Christopher Kyle Horton
quelle
0

So binde ich die UserSettings:

Generieren Sie eine Abhängigkeitsvariable, indem Sie propdpzweimal 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 userSettingsdurch:

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