Autor Beitrag
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Fr 11.02.11 12:57 
Hi,

ich spiele gerade ein bisschen mit WPF rum, um den Einstieg hinzubekommen. Daher habe ich mal ein Fenster gemacht, wo man das Layout eines Grid mit Steuerelementen per Schiebregler und einer Checkbox verändern kann. Der Schiebregler skaliert und die Checkbox soll das Grid flippen (negativ skalieren).
Dazu habe ich die folgende XAML verwendet:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
<Grid.LayoutTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="{Binding ElementName=sliderScale,Path=Value}" 
                                    ScaleY="{Binding ElementName=sliderScale,Path=Value}"/>
                </TransformGroup>
                
            </Grid.LayoutTransform>


Jetzt frage ich mich, wo man das Flippen per Checkbox da noch reinbringen könnte? Oder geht das nur über Code?


THX

_________________
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: blog.delphi-jedi.net = JEDI API LIB & Windows Security Code Library (JWSCL)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 11.02.11 14:35 
Um Code-Behind zu verhindern, könnte man ein MultiBinding mit ValueConverter verbinden, aber das dürfte ziemlich eindeutig Overkill sein. Und beide Techniken haben sich mit MVVM sowieso quasi erledigt ;) :
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public class MyGridViewModel : ViewModelBase
{
  public bool IsFlipped { ... }
  public double Scale { ... }

  public double ScaleOut { get { return IsFlipped ? -Scale : Scale;  } }

  public MyGridViewModel()
  {
    Bind(() => ScaleOut, /* dependencies */ () => IsFlipped, () => Scale);
  }
}

Das ist jetzt mein ganz eigenes INotifyPropertyChanged-Modell und wird sich wohl nur für etwas kompliziertere VMs lohnen, aber seitdem ich das einmal so implementiert habe, werde ich mich nie mehr an Value Converters oder Code Behind gewöhnen können :) .

_________________
>λ=
Dezipaitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Fr 11.02.11 19:29 
Oho, bitte 2 Gänge zurück.
Mittlerweile habe ich ein Multibinding mit einem eigenen Konverter (IMultiValueConverter) geschrieben. Das geht gut.

Doch ich würde gerne mehr über dein MV Klasse ViewModelBase erfahren. Was hast du da gemacht und wie hast du sie im XAML verwendet?

_________________
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: blog.delphi-jedi.net = JEDI API LIB & Windows Security Code Library (JWSCL)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 12.02.11 01:17 
So, nun von zu Hause aus kann ich mich ausführlicher äußern:
user profile iconDezipaitor hat folgendes geschrieben Zum zitierten Posting springen:
Was hast du da gemacht
Viiiel Reflection-Voodoo ;) . Hab sie gerade leider nicht einmal selbst zur Hand, da ich MVVM in dieser Form zum ersten Mal in einem Praktikum verwendet und danach noch nicht neu implementiert habe. Pete Brown hat eine kurze Übersicht zu dem Original-Code, den man mit solchen Tricks vermeiden will: 10rem.net/blog/2010/...-wpf-and-silverlight. Wobei ich im Vergleich zu seiner "aktiven" Implementierung eine "passive" (heutzutage wohl eher "reaktiv" :) ?) gewählt habe: "Wirf NotifyPropertyChanged für ScaleOut, wenn sich IsFlipped oder Scale geändert hat". Die "..." sollten für eine ganz normale INotifyPropertyChanged-Implementierung stehen - die füge ich per Template ein und klappe sie danach nie mehr auf.
Unabhängig von der internen Implementierung sollte der XAML-Code in allen Fällen gleich aussehen (angenommen, das VM sei im DataContext):
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<Slider Value="{Binding Scale}" ... />
<CheckBox Value="{Binding IsFlipped}" ... />

<Grid.LayoutTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="{Binding ScaleOut}" 
                                    ScaleY="{Binding ScaleOut}"/>
                </TransformGroup>
                
            </Grid.LayoutTransform>

_________________
>λ=