Wie Databind ich eine Höhe der Breite oder RowDefinition der Column?
-
02-07-2019 - |
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.
Lösung 2
Es gab eine Reihe von gotchas entdeckte ich:
- 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.
- Alle Eigenschaften GridLength sind nur lesbar, Sie haben einen neuen jedes Mal, wenn Sie es ändern erstellen.
- 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. IValueConverter
s 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.