85 Stimmen

Bindung an einen in den Einstellungen definierten Wert

In WPF, kann ich Bindung mit Werten in Einstellungen definiert verwenden? Wenn dies möglich ist, geben Sie bitte ein Beispiel.

145voto

CSharper Punkte 6697

Zunächst müssen Sie einen benutzerdefinierten XML-Namensraum hinzufügen, der den Namensraum für die Einstellungen definiert:

xmlns:properties="clr-namespace:TestSettings.Properties"

Greifen Sie dann in Ihrer XAML-Datei mit der folgenden Syntax auf die Instanz der Standardeinstellungen 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}" />

Fuente: WPF - Wie bindet man ein Steuerelement an eine in den Einstellungen definierte Eigenschaft?


Hinweis: Wie von @Daniel und @nabulke bereits erwähnt, sollten Sie nicht vergessen, die Zugriffsmodifikator Ihrer Einstellungsdatei auf Public y Umfang a User

14 Stimmen

Ich habe festgestellt, dass diese Methode nur funktioniert, wenn die Einstellungsdatei als öffentlich zugänglicher Modifikator gekennzeichnet ist. shortfastcode.blogspot.com/2009/12/

6 Stimmen

Um den Wert zu speichern, verwenden Sie MyApp.Properties.Settings.Default.Save() muss der Einstellungsbereich eingestellt werden auf Benutzer .

32voto

Thomas Levesque Punkte 277723

Die obige Lösung funktioniert zwar, aber ich finde sie ziemlich umständlich... 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 Informationen finden Sie hier: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/

2 Stimmen

Dies ist eine großartige Erweiterung, aber leider verlieren Sie Resharper intellisense. Nicht wert den Kompromiss IMHO, obwohl es sollte angemerkt werden, dass ich ein hoffnungsloser R# Fanboy bin :)

0 Stimmen

@OhadSchneider, in der Tat. Ich benutze ReSharper selbst, aber selten für XAML, weil ich es nicht so gut wie in C# finde...

10voto

Knowledge Cube Punkte 964

@CSharpers Antwort funktionierte nicht für meine WPF-Anwendung, die in VB.NET (nicht C#, im Gegensatz zu anscheinend 99,999 % der anderen WPF-Anwendungen) codiert ist, da ich einen anhaltenden Compilerfehler erhielt, der besagt, dass Settings konnte nicht gefunden werden in der MyApp.Properties Namespace, der auch nach einem Neuaufbau nicht verschwinden würde.

Nach langem Suchen im Internet fand ich heraus, dass es funktioniert, wenn ich stattdessen die local XAML-Namespace, der standardmäßig in der XAML-Datei des Hauptfensters meiner Anwendung erstellt wird:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>

...und binden Sie sich an meine Einstellungen, indem Sie etwas wie das Folgende verwenden (wobei MyBooleanSetting ist eine Einstellung, die ich in meinen Projekteigenschaften vom Typ Boolean und Bereich Benutzer, mit dem Standardzugriffsmodifikator Freund):

<CheckBox IsChecked="{Binding Source={x:Static local:MySettings.Default}, Path=MyBooleanSetting, Mode=TwoWay}"
          Content="This is a bound CheckBox."/>

Um sicherzustellen, dass die Einstellungen tatsächlich gespeichert werden, müssen Sie

MySettings.Default.Save()

...irgendwo in Ihrem Code-Behind (z.B. in der Me.Closing Veranstaltung für Ihr MainWindow.xaml.vb Datei).

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

0voto

nPcomp Punkte 6837

So binde ich die UserSettings:

Erzeugen Sie eine Abhängigkeitsvariable durch Eingabe von propdp und dann zweimal Tabulator.

    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 userSettings von:

Value="{Binding userSettings.SomeUserSettingHere, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

Und stellen Sie sicher, dass Sie die UserSettings speichern, wenn Sie sie ändern oder beim Beenden:

UserSettings.Default.Save();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X