Laden...

Databinding zu Sigelton Klasse

Erstellt von Zakant vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.616 Views
Z
Zakant Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren
Databinding zu Sigelton Klasse

Moin,

ich habe mich vor einiger Zeit mal an WPF herangewagt und bin dann zwangsläufig auch auf das Databidning gestoßen, was soweit auch recht gut funktioniert.

Nun habe ich allerdings das Problem, dass ich gerne einige Steuerelemente an eine Singelton Klasse binden möchte, die die Aktuellen Einstellungen repräsentiert.

Die Namespace Imports:


<Window x:Class="CSCore_Test.frmOption"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="CSCore_Test"
        Title="Optionen" Height="300" Width="300" Loaded="Window_Loaded">

Und das Steuerlement:


<CheckBox Grid.Row="1" Name="cbRandom" Content="Zufällige Wiedergabe" Checked="{Binding RandomPlayback, Source={x:Static local:Settings.Instance}}" />

Der Fehler, der geworfen wird ist:> Fehlermeldung:

Der Name "Settings" ist im Namespace "CSCore_Test" nicht vorhanden.

Der Vollständigkeit halber hier einmal die Klasse "Settings" 😉


namespace CSCore_Test
{
    public class Settings : INotifyPropertyChanged
    {
        //Singelton
        private static Settings _instance;

        public static Settings Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new Settings();
                return _instance;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string name)
        {
            var myevent = PropertyChanged;
            if (myevent != null)
                myevent(null, new PropertyChangedEventArgs(name));
        }

        private bool _random = false;
        public bool RandomPlayback
        {
            get
            {
                checkfirstAccess();
                return _random;
            }
            set
            {
                _random = value;
                OnPropertyChanged("RandomPlayback");
            }
        }
    }
}

So, ich hoffe, ich hab mich einigermaßen verständlich ausgedrückt und auch nichts Wichtiges vergessen oder hab ein Thema aufgegriffen, dass hier schon 1000 diskutiert wurde😉
In diesem Sinne schönes Wochenende
Gruß Christian

4.931 Beiträge seit 2008
vor 10 Jahren

Hallo Zakant,

welche .NET-Version verwendest du? Erst ab 4.5 ist das Binden an statische Eigenschaften möglich: What's New in WPF Version 4.5 - Binding to static properties.

Z
Zakant Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Moin, ahh, gut zu wissen, aber das Projekt hat als Ziel Framework 4.5 eingestellt, also sollte da nicht das Problem liegen, soweit ich das verstehe, oder?

5.657 Beiträge seit 2006
vor 10 Jahren

Hi Zakant,

hast du es mal so probiert:

 xmlns:local="clr-namespace:CSCore_Test"

Christian

Weeks of programming can save you hours of planning

Z
Zakant Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Danke, für den Tipp, das hatte ich allerdings schonmal probiert und es ändert leider an dem Problem nix, bis auf die Tatsache, dass die Fehler meldung zu:> Fehlermeldung:

Der Name "Settings" ist im Namespace "clr-namespace:CSCore_Test" nicht vorhanden. wird...

Gruß Christian

I
36 Beiträge seit 2013
vor 10 Jahren

Hi,

woran es genau liegt kann ich zwar auch nicht sagen ohne es auszuprobieren -
allerdings vermisse ich vom Design her den private Constructor und ein Lock.


public class Settings : INotifyPropertyChanged
    {
        private static Settings _instance;

        //Singelton
        private Settings(){ }

        public static Settings Instance
        {
            get
            {
                lock(_instance){
                    if (_instance == null)
                        _instance = new Settings();
                    return _instance;
                }
            }
        }

++++ Tag ein, Tag aus: HTML-Programmierer beklagt monotone Arbeit ++++
++++ Ein Witz auf seine Kosten: Masochist kann nur gequält lächeln ++++
++++ Nichts dran: Model leugnet Magersucht ++++

S
248 Beiträge seit 2008
vor 10 Jahren

Hallo Zakant,

mach mal bitte folgende Änderung:

 <CheckBox Grid.Row="1" Name="cbRandom" Content="Zufällige Wiedergabe" IsChecked="{Binding RandomPlayback, Source={x:Static local:Settings.Instance}}" /> 

dann sollte es gehen; zumindest bei mir ging es dann.

Hallo irgendwas,

lock auf ein Feld das noch null ist beim ersten Zugriff, ist vielleicht keine so tolle Idee ...

private static readonly Settings _instance = new Settings();

Sollte das gewünschte Ergbis bringen und beim getter werden keine ifs oder locks mehr benötigt.

Grüße

Z
Zakant Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Danke für all die Antworten.
Mitlerweile hab ich das ganze auch zum laufen bekommen, allerdings ohne eine AHnung, wieso und warum oder überhaupt... Daher leider auch von mir keine Lösung, die das Problem behoben hat. In einem zweiten Testprojekt funktionierte der Teil auf jeden Fall 😉
Mal so ganz nebenbei: Kennt jemand eine gute Quelle für wpf Binding? Also nicht unbedingt "von-null-auf" tutorials, sondern ehr referenzen?

Gruß Christian

I
36 Beiträge seit 2013
vor 10 Jahren

Hallo irgendwas,

lock auf ein Feld das noch null ist beim ersten Zugriff, ist vielleicht keine so tolle Idee ...

private static readonly Settings _instance = new Settings();  

Sollte das gewünschte Ergbis bringen und beim getter werden keine ifs oder locks mehr benötigt.

Grüße

Oh Gott, ja, da merkt man meinen im Moment gedrehten Tagesrhythmus ... danke für die Richtigstellung.

++++ Tag ein, Tag aus: HTML-Programmierer beklagt monotone Arbeit ++++
++++ Ein Witz auf seine Kosten: Masochist kann nur gequält lächeln ++++
++++ Nichts dran: Model leugnet Magersucht ++++