none
Binding von Width und Height Property von Window mit Converter RRS feed

  • Frage

  • Hallo liebe NG.

    Ich stehe vor folgendem Problem:

    Ich möchte die Properties Width und Height eines Window mittels Binding setzen. Dazu brauche ich einen Converter, da das Ziel-Property die Size liefert. Nun habe ich das folgendermassen versucht:

    <Window x:Name="Popup"
              x:Class="PopupView"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Height="{Binding Path=DataContext.WindowSize, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource sizeToHeigthConverter}, FallbackValue=950}"
              Width="{Binding Path=DataContext.WindowSize, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource sizeToWidthConverter}, FallbackValue=1100}"
              DataContext="{Binding ElementName=content, Path=Content.DataContext}">
      <Window.Resources>
        <pic:SizeToHeightConverter x:Key="sizeToHeigthConverter" />
        <pic:SizeToWidthConverter x:Key="sizeToWidthConverter" />
      </Window.Resources>
    
    

    Die Problematik scheint hier aber zu sein, dass ich die Resourcen, die ich in <Window.Resources> definiere, im Window selbst noch nicht verwenden kann. Sie werden jedenfalls nicht gefunden. Ich frage mich nun, wo ich die denn nun definieren kann. Kann der Convert z.B. direkt im Binding definiert werden - anstatt als Resource?

    Vielen Dank für eure Hilfe.

    Viele Grüsse, Thomas

    Samstag, 12. Februar 2011 14:41

Alle Antworten

  • Die StaticResources der Converter kannst du in der App.xaml erstellen, diese werden dann als aller erstes erstellt.

     

    Sonntag, 13. Februar 2011 11:48
    Beantworter
  • Hallo.

    Ich habe das nun folgendermassen im Codebehind versucht zu lösen (im Konstruktor nach dem Aufruf von InitializeComponent()):

          var binding = new Binding("DataContext.WindowSize")
            {RelativeSource = new RelativeSource(RelativeSourceMode.Self), Converter = new SizeToHeightConverter(), Mode = BindingMode.OneWay};
          this.SetBinding(HeightProperty, binding);
    
    

    Ganz komisch ist nun aber, dass das manchmal funktioniert und manchmal nicht. Ich kann leider auch keine Regelmässigkeit feststellen, wann es funktioniert und wann nicht.

    Hat evt. jemand eine Idee, was der Grund sein könnte? - ich bin über jeden Hinweis dankbar.

    Viele Grüsse, Thomas

    Sonntag, 13. Februar 2011 18:50
  • Probier das ganze mal mit ActualWidth und ActualHeigth.
    Montag, 14. Februar 2011 07:27
    Beantworter
  • Das geht nicht, das ActualWidth und ActualHeight keine writable Properties sind. Folgende Fehlermeldung tritt auf:

     ---> System.ArgumentException: Die ActualHeight-Eigenschaft kann nicht an Daten gebunden werden.

    Montag, 14. Februar 2011 07:54
  • Ok, die sind ReadOnly.

    Also bei mir klappt das immer mit dem Height, nach dem Init.
    Bist du sicher, dass das WindowSize Prop immer einen gültigen Wert hat?

     

    Montag, 14. Februar 2011 08:05
    Beantworter
  • Ja, der Wert ist quasi konstant:

        public override Size WindowSize {
          get {
            return new Size(1275, 950);
          }
        }
    
    Andere Frage: Gibt es irgendein Logging das ich einschalten kann um zur Laufzeit das Binding zu kontrollieren? - Evt. komme ich so der Ursache auf die Spur.

    Montag, 14. Februar 2011 08:12
  • Du kannst dir mit System.Diagnostics.Debug Werte ausgeben lassen.

    Evlt. würde ich deinen Converter nochmal überprüfen...
    Montag, 14. Februar 2011 08:25
    Beantworter
  • Ich dachte eher an ein Logging, in dem ich Informationen vom Framework bzgl. den Bindings bekomme.

    Der Converter passt - Es ist wirklich so, dass das __GLEICHE__ manchmal funktioniert und manchmal nicht. D.h. das Property WindowSize wird manchmal aufgerufen und manchmal nicht.

    Montag, 14. Februar 2011 08:29
  • Wird das Window jedesmal neu instanziert?

    Es gibt ein Tool Snoop, das könnte dir evtl. weiterhelfen...

    http://blois.us/Snoop/

     

    Montag, 14. Februar 2011 08:36
    Beantworter
  • Ja, wird es. Es wird auch jedesmal ein neues ViewModel erstellt, dass als DataContext fungiert.
    Montag, 14. Februar 2011 08:39