我正在尝试将DependancyProperty
我的一个用户控件中的 a 绑定到a中的 a的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(在本例中为 Slider),但绑定到“TitleSection”(即 Grid 中定义的 ColumnDefinition)失败。在代码中放置断点并监视“TitleSection”会返回预期的对象。
我开始怀疑不能绑定 ax:Name'd ColumnDefinition 。谁能建议我如何能够绑定到网格中第一列的不断变化的宽度?
编辑#1 - 回答评论
数据绑定“失败”是因为在TitleWidth
属性的设置器上设置了断点,并使用 GridSplitter 控件调整第一列的大小,断点永远不会被命中。TitleWidth
此外,当 DependancyProperty更改未执行时,我希望触发的代码。
正在创建用户控件并将其添加到函数中 Grid 内的 Stackpanel Window_Loaded
。我希望在构建用户控件时已经呈现了网格。当然,x:Name'd 元素TitleSection
是可观察的,并且具有100
构建它们的时间/绑定发生之前的值。
编辑#2 - 可能与此有关?
我一直在对 Grid ColumnDefinition 文档的 MSDN 页面进行嗅探,并且遇到了GridLength()但我无法理解如何在绑定表达式中使用它。我不能在绑定代码中使用关联的 GridLengthConverter 作为转换器,因为它不是从 IValueConverter 派生的。
我倾向于以某种方式绑定到 Grid 对象中一个单元格的 ActualWidth 属性。它似乎不像绑定到列定义那样干净,但目前我无法让它工作。