Laden...

Point mit Slider verschieben

Erstellt von perlfred vor einem Jahr Letzter Beitrag vor einem Jahr 674 Views
P
perlfred Themenstarter:in
261 Beiträge seit 2010
vor einem Jahr
Point mit Slider verschieben

Hallo!

Ich möchte die X oder Y - Komponente eines Point mithilfe eines Sliders verschieben.

Da Point eine Struktur darstellt kann man die einzelnen Komponenten (X/Y) nicht direkt binden sondern muss immer eine neue Instanz mit den geänderten Werten instanzieren.

Dafür habe ich einen ValuConverter:

public class ToPoint_MultiConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
       if(values[0] is double Xdouble && values[1] is double Ydouble)
       {
           return new Point(Xdouble, Ydouble);
       }
       return new Point();                
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
   {

       object[] ret = new object[2];           // Rückgabe Array initalisieren
       ret[0] = 0; ret[1] = 0;                 // Rückgabe mit Null-Werten initalisieren

       if (value is Point Punkt)               // Ist der Übergabe-Wert vom Type Point?
       {
           ret[0] = Punkt.X; ret[1] = Punkt.Y; // Rückgabe-Werte für das Binding 1 (X) und Binding 2 (Y) übergeben.
       }
       return ret;                             // Werte des Punktes an das Binding 1 (X) und Binding 2 (Y) zurückgeben.
   }
}   

In der View könnte ich den einzelnen Binding's auch die Werte zuordnen, aber wie bekomme ich eine Zuordnung zu der VM-Eigenschaft (SchalterMittelpunkt) ???

<SchalterMittelpunkt>
    <MultiBinding Converter="{StaticResource PointKonv}">
        <Binding Path="Slider.Value" />
        <Binding Path="SchalterMittelpunkt.Y"/>
    </MultiBinding>
</SchalterMittelpunkt>
2.080 Beiträge seit 2012
vor einem Jahr

<Binding Path="Slider.Value" /> sollte eigentlich nicht funktionieren.
Du müsstest stattdessen nur Value binden und zusätzlich ElementName=Slider.

<Binding Path="SchalterMittelpunkt.Y"/> sollte allerdings schon funktionieren, solange der DataContext auch das ViewModel ist und eine "SchalterMittelpunkt"-Property existiert.

Ansonsten: Was ist das Problem?

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

P
perlfred Themenstarter:in
261 Beiträge seit 2010
vor einem Jahr

Hallo Palladin007!

Danke für deine Antwort.

Das ganze Konstrukt funktioniert so natürlich nicht. Es sollte nur veranschaulichen, was ich möchte.

Ich möchte die VM-Eigenschaft SchalterMittelpunkt vom Type Point  auf der View durch 2 Slider (jeweils für die X und für die Y Komponente) steuern können.

Im Slider selbst geht das nicht, da ich nicht die Slider-Value-Eigenschaft an einen Point binden kann, sondern mit der Slider-Value vom Type double eine Komponente (X oder Y) der VM-Eigenschaft SchalterMittelpunkt setzen möchte.

<Slider ... >
   <Slider.Value>
       <MultiBinding Converter="{StaticResource PointKonv}">
           <Binding Path="Value"/>
           <Binding Path="SchalterMittelpunkt.Y" />
       </MultiBinding>
   </Slider.Value>
</Slider>

Deshalb habe ich in meinem Konstrukt <SchalterMittelpunkt> angegeben. Wie ich die Slider-Value im Multibinding binde (Elementname oder relativer Pfad) ist erst einmal zweitrangig.

Ich suche also nach einer Möglichkeit die VM-Eigenschaft in XAML verfügbar zu machen. Der Converter gibt die (neue) passende Point-Instanz zurück aber wie binde ich diese (in XAML) an die VM-Eigenschaft???

Anmerkung 1:
Mit einem OneWayToSource-Binding habe ich auch keine Lösung gefunden.

Anmerkung 2:
Man kann natürlich die X und Y Komponente als seperate VM-Eigenschaften deklarieren und dadurch die Einzel-Eigenschaften ganz normal (einzeln) an die Slider binden, aber es muß doch auch eine Lösung für Point's geben.

2.080 Beiträge seit 2012
vor einem Jahr

Warum gibst Du dem ViewModel nicht einfach drei Properties SchalterMittelpunktX, SchalterMittelpunktYund SchalterMittelpunkt?
SchalterMittelpunkthat dann nur einen Getter und gibtnew Point(SchalterMittelpunktX, SchalterMittelpunktY) zurück?

So sparst Du dir den Converter und hast keine komplizierten Bindings.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

P
perlfred Themenstarter:in
261 Beiträge seit 2010
vor einem Jahr

Hallo Palladin007!

Deine Idee mit der übergeordneten VM-Eigenschaft, SchalterMittelpunkt, ist auch nicht schlecht, ansonsten entspricht es eben meiner 2. Anmerkung und ich dachte, es geht auch eleganter.

In der Umsetzung  binde ich dann per OneWayToSource Binding an die korespondierenden Punkt-Komponenten-Eigenschaft(en).

Für den X-Wert:

<Slider Value="{Binding SchalterMittelpunktX, Mode=OneWayToSource}" ... >

Vielen Dank!

2.080 Beiträge seit 2012
vor einem Jahr

Eleganz ist ein zweischneidiges Schwert, wo hört Eleganz auf und wird einfach nur umständlich? 😉
Man kann ViewModel-Properties nicht an View-Properties binden, nicht mit Haus-Mitteln jedenfalls.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.