我试图将我的用户控件中的一个DependancyProperty
绑定到的Width
属性的Grid
中。WPF绑定到网格列宽
我具有类似于此代码:
<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 */
第1装订定义的作品充满了想象,虽然这是绑定到一个实际的UIElement(在这种情况下是一个Slider),但绑定到“TitleSection”(这是在网格中定义的ColumnDefinition)失败。在代码中放置一个断点并在“TitleSection”上执行监视可返回预期的对象。
我开始怀疑x:Name'd ColumnDefinition不能绑定到。 任何人都可以建议我怎么能绑定到我的网格中第一列的变化宽度?
编辑#1 - 为了回答评论
数据绑定在这个意义上“失败”,与上引领者TitleWidth
属性设置一个断点,并使用GridSplitter控制来调整第一列,断点不会被击中。另外,当DependancyProperty TitleWidth
更改没有得到执行时,我预计会触发代码。
正在创建用户控件并将其添加到网格中的功能Window_Loaded
函数中的Stackpanel。我期望在Usercontrols被构建的时候Grid已经被渲染了。当然,x:Named元素TitleSection
是可视的,并且在构造/绑定发生之前,其值为100
。
编辑#2 - 可能与此有关?
我一直在嗅探Grid GridDefinition文档的MSDN页面,并且遇到了GridLength(),但我无法理解我如何在绑定表达式中使用它。我不能在绑定代码中使用关联的GridLengthConverter作为转换器,因为它不是从IValueConverter派生的。
我倾向于以某种方式绑定到网格对象的其中一个单元格的ActualWidth属性。它看起来不像绑定到列定义那么干净,但是目前我无法让它工作。
不知道如何以及在什么时候创建usercontrol?网格是否显示? – Donnelle 2008-11-13 00:47:26
您不能依赖在依赖属性的set/get中设置断点,因为它们永远不会被绑定引擎使用。内部依赖属性的设置使用SetValue(DependencyProperty,值) – 2008-11-13 08:51:37