Pregunta

Bajo el patrón View-Model-ViewModel para WPF, estoy tratando de vincular los datos de Alturas y Anchuras de varias definiciones para los controles de cuadrícula, de modo que pueda almacenar los valores que el usuario establece después de usar un GridSplitter. Sin embargo, el patrón normal no parece funcionar para estas propiedades particulares.

Nota: Estoy publicando esto como una pregunta de referencia que estoy publicando porque Google me falló y tuve que resolverlo yo mismo. Mi propia respuesta a seguir.

¿Fue útil?

Solución 2

Descubrí una serie de errores:

  1. Aunque puede aparecer como un doble en XAML, el valor real de la Altura o el Ancho de una * Definición es una estructura 'GridLength'.
  2. Todas las propiedades de GridLength son de solo lectura, debes crear una nueva cada vez que la cambies.
  3. A diferencia de todas las demás propiedades en WPF, Width y Height no establecen su modo de enlace de datos en "TwoWay", debe configurarlo manualmente.

Por lo tanto, utilicé el siguiente código:

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");
    }
}

Y el XAML:

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

Otros consejos

Cree un IValueConverter de la siguiente manera:

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;
    }
}

Luego puede utilizar el convertidor en su Enlace:

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

Otra posibilidad, dado que mencionó la conversión entre GridLength y int , es crear un IValueConverter y usarlo cuando se vincula a Ancho . Los IValueConverter también manejan enlaces bidireccionales porque tienen los métodos ConvertTo () y ConvertBack () .

La solución más sencilla es utilizar simplemente la configuración de cadena para estas propiedades, de modo que WPF las admita automáticamente utilizando GridLengthConverter sin ningún trabajo adicional.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top