Frage

Unter dem Viewmodel-Viewmodel-Muster für WPF, Ich versuche, die Höhen und Breiten der verschiedenen Definitionen für die Netzkontrollen Databind, so kann ich die Werte zu speichern, der Benutzer sie setzt, um nach einem Gridsplitter verwenden. Allerdings ist das normale Muster nicht scheint für diese besonderen Eigenschaften zu arbeiten.

Hinweis: Ich bin dies als Referenz Frage veröffentlichen, die ich Entsendung bin wie Google mich im Stich gelassen, und ich hatte die selbst zu erarbeiten. Meine eigene Antwort zu folgen.

War es hilfreich?

Lösung 2

Es gab eine Reihe von gotchas entdeckte ich:

  1. Auch wenn es wie ein Doppel in XAML, der tatsächliche Wert für a * Definition der Höhe oder Breite ist eine 'GridLength' Struktur erscheinen.
  2. Alle Eigenschaften GridLength sind nur lesbar, Sie haben einen neuen jedes Mal, wenn Sie es ändern erstellen.
  3. Im Gegensatz zu allen anderen Eigenschaft in WPF, Breite und Höhe nicht ihre Databinding-Modus standardmäßig auf ‚TwoWay‘, müssen Sie diese manuell einstellen.

So betrachtete, habe ich den folgenden Code:

private GridLength myHorizontalInputRegionSize = new GridLength(0, GridUnitType.Auto)
public GridLength HorizontalInputRegionSize
{
    get
    {
        // If not yet set, get the starting value from the DataModel
        if (myHorizontalInputRegionSize.IsAuto)
            myHorizontalInputRegionSize = new GridLength(ConnectionTabDefaultUIOptions.HorizontalInputRegionSize, GridUnitType.Pixel);
        return myHorizontalInputRegionSize;
    }
    set
    {
        myHorizontalInputRegionSize = value;
        if (ConnectionTabDefaultUIOptions.HorizontalInputRegionSize != myHorizontalInputRegionSize.Value)
        {
            // Set the value in the DataModel
            ConnectionTabDefaultUIOptions.HorizontalInputRegionSize = value.Value;
        }
        OnPropertyChanged("HorizontalInputRegionSize");
    }
}

Und das XAML:

<Grid.RowDefinitions>
    <RowDefinition Height="*" MinHeight="100" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="{Binding Path=HorizontalInputRegionSize,Mode=TwoWay}" MinHeight="50" />
</Grid.RowDefinitions>

Andere Tipps

Erstellen Sie eine IValueConverter wie folgt:

public class GridLengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double val = (double)value;
        GridLength gridLength = new GridLength(val);

        return gridLength;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        GridLength val = (GridLength)value;

        return val.Value;
    }
}

Sie können dann verwenden Sie den Konverter in Ihrer Bindung:

<UserControl.Resources>
    <local:GridLengthConverter x:Key="gridLengthConverter" />
</UserControl.Resources>
...
<ColumnDefinition Width="{Binding Path=LeftPanelWidth, 
                                  Mode=TwoWay,
                                  Converter={StaticResource gridLengthConverter}}" />

Eine andere Möglichkeit, da man zwischen GridLength und int gebracht Umwandlung ist eine IValueConverter zu erstellen und nutzen, wenn sie Width verbindlich. IValueConverters auch behandeln Zwei-Wege-Bindung, da sie beide ConvertTo() und ConvertBack() Methoden haben.

Die einfachste Lösung ist einfach zu bespannen Einstellungen für diese Eigenschaften zu verwenden, so dass WPF automatisch GridLengthConverter ohne zusätzliche Arbeit mit unterstützen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top