Я пытаюсь связать DependancyProperty
в одном из моих пользовательских контроллеров со свойством Width
Column
в Grid
.
У меня есть код, подобный этому:
<Grid x:Name="MyGridName">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="TitleSection" Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... />
</Grid>
В отдельном пользовательском контроле я определил следующее DependancyProperty
.
public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl));
public int TitleWidth
{
get { return (int)base.GetValue(TitleWidthProperty); }
set { base.SetValue(TitleWidthProperty, value); }
}
Я создаю экземпляры Usercontrol в коде, поэтому у меня есть оператор привязки, подобный следующему:
MyUserControl Cntrl = new MyUserControl(/* Construction Params */);
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay });
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay });
/* Other operations on Cntrl */
Первая определенная привязка работает фантастически, хотя это привязка к реальному UIElement (в данном случае к ползунку), но привязка к «TitleSection» (который является ColumnDefinition, определенным в Grid) не выполняется. Установка точки останова в коде и выполнение наблюдения за «TitleSection» возвращает ожидаемый объект.
Я начинаю подозревать, что x: Name'd ColumnDefinition не может быть привязан к. Кто-нибудь может подсказать, как я могу привязаться к изменяющейся ширине первого столбца в моей сетке?
РЕДАКТИРОВАТЬ # 1 - Чтобы ответить на комментарии
Привязка данных «терпит неудачу» в том смысле, что с точкой останова, установленной в установщике для свойства TitleWidth
, и с использованием элемента управления GridSplitter для изменения размера первого столбца точка останова никогда не будет достигнута. Кроме того, код, который я ожидаю, будет запущен, когда изменения DependancyProperty TitleWidth
не будут выполнены.
Пользовательский контроль создается и добавляется в панель стека в сетке в функции Window_Loaded
. Я ожидаю, что Grid будет отображаться к моменту создания пользовательских контролей. Конечно, элемент x: Name'd TitleSection
является наблюдаемым и имеет значение 100
, когда они создаются / до того, как происходит привязка.
РЕДАКТИРОВАТЬ # 2 - Возможно, что-то делать с этим?
Я нюхал страницы MSDN для документации Grid ColumnDefinition и наткнулся на GridLength () , но я не могу понять, как я могу использовать это в выражении привязки , Я не могу использовать связанный GridLengthConverter в качестве преобразователя в коде привязки, поскольку он не является производным от IValueConverter.
Я склоняюсь к каким-либо привязкам к свойству ActualWidth одной из ячеек в объекте Grid. Это не так чисто, как привязка к определению столбца, но сейчас я не могу заставить это работать.