Как настроить привязку ширины столбца ColumnDefinition или RowDefinition?
В шаблоне View-Model-ViewModel для WPF я пытаюсь привязать высоты и ширины различных определений для элементов управления сеткой, поэтому я могу сохранить значения, которые пользователь устанавливает после использования GridSplitter. Однако нормальный шаблон, похоже, не работает для этих конкретных свойств.
Примечание. Я размещаю это как ссылочный вопрос, который я отправляю, поскольку Google сбил меня с толку, и мне пришлось самому это проработать. Мой собственный ответ.
- WPF CommandParameter NULL первый раз, когда вызывается CanExecute
- WPF Databinding: как мне получить доступ к «родительскому» контексту данных?
- Как связать массив байтов с изображением в WPF с преобразователем значений?
- KnockOutJS - Несколько режимов просмотра в одном представлении
- Связывание ComboBox SelectedItem с использованием MVVM
- Как связать несколько значений с одним текстовым блоком WPF?
- Как сделать тип привязки данных безопасным и поддерживать рефакторинг
- Что такое имена столбцов DataTable с точками, что делает их непригодными для управления DataGrid WPF?
- WPF - привязка к индексу предметов изнутри ItemTemplate of ItemsControl?
- WPF: отобразить значение bool как «Да» / «Нет»
Создайте 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; } }
Затем вы можете использовать конвертер в своем привязке:
...
Было обнаружено несколько ошибок:
- Хотя это может выглядеть как double в XAML, фактическое значение для высоты * или ширины определения * является структурой «GridLength».
- Все свойства GridLength – только для чтения, вы должны создавать новый каждый раз, когда вы его изменяете.
- В отличие от любого другого свойства в 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 без дополнительной работы.