Как настроить привязку ширины столбца ColumnDefinition или RowDefinition?

В шаблоне View-Model-ViewModel для WPF я пытаюсь привязать высоты и ширины различных определений для элементов управления сеткой, поэтому я могу сохранить значения, которые пользователь устанавливает после использования GridSplitter. Однако нормальный шаблон, похоже, не работает для этих конкретных свойств.

Примечание. Я размещаю это как ссылочный вопрос, который я отправляю, поскольку Google сбил меня с толку, и мне пришлось самому это проработать. Мой собственный ответ.

Создайте IValueConverter следующим образом:

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

Затем вы можете использовать конвертер в своем привязке:

    ...  

Было обнаружено несколько ошибок:

  1. Хотя это может выглядеть как double в XAML, фактическое значение для высоты * или ширины определения * является структурой «GridLength».
  2. Все свойства GridLength – только для чтения, вы должны создавать новый каждый раз, когда вы его изменяете.
  3. В отличие от любого другого свойства в WPF, Width и Height не применяют режим привязки данных к «TwoWay», вы должны вручную установить это.

Таким образом, я использовал следующий код:

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

И XAML:

      

Другая возможность, так как вы привели преобразование между GridLength и int , заключается в создании IValueConverter и использовании его при привязке к Width . IValueConverter также обрабатывает двустороннюю привязку, потому что у них есть ConvertTo() и ConvertBack() .

Самое простое решение – просто использовать строковые настройки для этих свойств, чтобы WPF автоматически поддерживал их с помощью GridLengthConverter без дополнительной работы.

Давайте будем гением компьютера.