Laden...

Zwei Bindings einen Objekt zuweisen dynamisch

Erstellt von sicarius vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.464 Views
S
sicarius Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren
Zwei Bindings einen Objekt zuweisen dynamisch

Hallo an alle,

beschäftige mich seit kurzer Zeit mit WPF und muss sagen die Bindings machen einen kirre.
Wie man einzelne Bindings setzt habe ich mittlerweile verstanden aber nun möchte ich gerne zwei setzten.
Zur Erklärung:
Es existiert ein Button welcher nur Enabled sein soll wenn Bedingung1 (Binding1) oder Bedingung2 (Binding2) erfüllt ist.

Das ganze soll dynamisch sein also, per SetBinding oder wie bei mehreren Bindings der passende Befehl lautet.

Ich hoffe Ihr könnt mir weiter helfen, danke.

Grüße
Christian

16.835 Beiträge seit 2008
vor 11 Jahren

Also wenn ich das jetzt richtig versteh willst Du nichts anderes als ein MultiDataTrigger mit mehreren Conditions. Hier kannst Du dann eine Ziel-Property entsprechend manipulieren, wenn alle Conditions erfüllt sind. Wenn Du mehrere an den Code gebundene Properties abfragen musst, so wäre dies auch möglich - oder Du hilfst Dir über eine Hilfs-Property, die den validen Zustand repräsentiert.

Bestimmt gibts aber auch bessere Lösungen in der weiten WPF-Welt 😃

Edit: siehe zum Beispiel des Lösungsvorschlag von michlG.

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo sicarius,

für so einen Fall nimmt man meistens Commands.
D.h. dein ViewModel definiert ein Command an welches dein Button gebunden wird.
Im Command kannst du über CanExecute festlegen ob dein Command ausgeführt werden kann (also ob deine Bedingungen erfüllt sind).
Der Button wird dann automatisch dementsprechend aktiviert / deaktiviert.

Wenn du das nicht willst dann kannst du das was du da machen willst über ein MultiBinding (mit MultiBindingConverter) lösen oder du nimmst dafür einen Trigger. Möglichkeiten gibt es viele 😉

Grüße
Michael

S
sicarius Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

Danke für die Antworten.
Das mit den MultiDataTrigger hört sich interessant an, werde ich mir mal anschauen.

Was das Command angeht ist es doch fast das selbe wie ich jetzt mache, nur das ich anstatt canClick die Bedingung auswerte.


        public static void Bind(object dataSource, object sourcePath, FrameworkElement destinationObject, DependencyProperty dp, string stringFormat, BindingMode bindingMode, IValueConverter converter)
        {
            Binding binding = new Binding
            {
                Source = dataSource,
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                Mode = bindingMode,
                Path = new PropertyPath(sourcePath),
                StringFormat = stringFormat,
                Converter = converter
            };
            destinationObject.SetBinding(dp, binding);
        }

...
private Test test = new test();

Bind(test, "CanClick", Button1, Button.IsEnabledProperty, null, BindingMode.Default, null);
...

    class Test : INotifyPropertyChanged
    {
        private bool canClick;

        public bool CanClick
        {
            get { return canClick; }
            protected set
            {
                bool oldValue = canClick;
                canClick = value;
                if (oldValue != canClick)
                    NotifyPropertyChanged("CanClick");
            }
        }
  }


3.430 Beiträge seit 2007
vor 11 Jahren

Hallo,

ja das ist Ähnlich.
Aber der Unterschied ist dass du dann auch das Execute hast. D.h. du must nicht das Click Event abonnieren sondern kannst das auch direkt mit dem Command machen.
Damit hast du den Vorteil dass du keine Abhängigkeiten zwischen Gui und Code hast.

Wozu machst du das Binding im Code? Das ist viel umständlicher..

Grüße
Michael

S
sicarius Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

Ich habe den Teil des Bindings aus einen Beispielprojekt, ich würde sagen das es daher beruht, da als Bindingsource eine Singleton Klasse zum Einsatz kommt.

Das mit den Command hatte ich auch schon bei ein paar anderen Steuerelementen aber ich muss echt gestehen das ganze WPF ist schon für einen Laien sowas von frustrieren und verwirrend. Da hat man echt zu kämpfen nicht alles an die Wand zu schmeißen und gewohnt mit WinForms zu arbeiten.

Vor allem die Eventbehandlung ist sehr gewöhnungsbedürftig, bis man da durchblickt.
Und Beispiele im Netz sind auch nicht so der brüller, da zwar Klassen von INotifyPropertyChanged abgeleitet werden aber nirgends der Zusammenhang mit den Bindung richtig dargestellt ist.

Auch das mit den RelayCommand hat locker einige Stunden verschlungen bis ich da etwas brauchbares und verständliches gefunden hatte.

Grüße
Christian