【发布时间】:2010-09-22 02:13:51
【问题描述】:
我试图将我的一个用户控件中的DependancyProperty 绑定到Grid 中Column 的Width 属性。
我有类似这样的代码:
<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); }
}
我正在代码中创建用户控件的实例,因此我有一个类似于此的绑定语句:
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”会返回预期的对象。
我开始怀疑不能绑定 x:Name'd ColumnDefinition。 谁能建议我如何才能绑定到网格中第一列的不断变化的宽度?
编辑 #1 - 回答 cmets
数据绑定“失败”是因为在 TitleWidth 属性的设置器上设置了断点,并使用 GridSplitter 控件调整第一列的大小,断点永远不会被命中。此外,当 DependancyProperty TitleWidth 更改未执行时,我希望触发的代码。
正在创建用户控件并将其添加到Window_Loaded 函数中网格内的堆栈面板。我希望在构建用户控件时已经呈现了网格。当然 x:Name'd 元素 TitleSection 是可观察的,并且在构造它们时/在绑定发生之前具有 100 的值。
编辑 #2 - 可能与此有关?
我一直在浏览 MSDN 页面以获取 Grid ColumnDefinition 文档,并且遇到了GridLength(),但我不知道如何在绑定表达式中使用它。我不能在绑定代码中使用关联的 GridLengthConverter 作为转换器,因为它不是从 IValueConverter 派生的。
我倾向于以某种方式绑定到 Grid 对象中一个单元格的 ActualWidth 属性。它似乎不像绑定到列定义那样干净,但目前我无法让它工作。
【问题讨论】:
-
如何以及在什么时候创建用户控件失败?网格显示了吗?
-
您不能依赖在依赖属性的 set/get 中设置断点,因为绑定引擎永远不会使用它们。使用 SetValue(DependencyProperty, value) 设置内部依赖属性