visual studio que puede programacion presentacion hacer ejemplos desventajas con animaciones wpf data-binding grid column-width row-height

que - visual studio wpf



¿Cómo se enlazan los datos de un ColumnDefinition''s Width o RowDefinition''s Height? (4)

Bajo el patrón View-Model-ViewModel para WPF, estoy tratando de vincular las Alturas y Anchos de varias definiciones para los controles de cuadrícula, así puedo almacenar los valores a los que el usuario los 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, ya que Google me falló y tuve que resolverlo yo mismo. Mi propia respuesta a seguir.


Hubo una cantidad de trampas que descubrí:

  1. Aunque puede aparecer como un doble en XAML, el valor real para * Height o Width es una estructura ''GridLength''.
  2. Todas las propiedades de GridLength son de solo lectura, tienes que crear una nueva cada vez que la cambies.
  3. A diferencia de cualquier otra propiedad en WPF, Ancho y Altura no predeterminan su modo de enlace de datos a ''TwoWay'', usted tiene que 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>


La solución más sencilla es simplemente usar configuraciones de cadena para estas propiedades, de modo que WPF las soporte automáticamente usando GridLengthConverter sin ningún trabajo adicional.


Otra posibilidad, ya que trajo la conversión entre GridLength e int , es crear un IValueConverter y usarlo cuando se vincula a Width . IValueConverter s también maneja el enlace bidireccional porque tienen los métodos ConvertTo() y ConvertBack() .


Cree un IValueConverter 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; } }

A continuación, 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}}" />