当前位置:  开发笔记 > 编程语言 > 正文

WPF绑定到网格列宽度

如何解决《WPF绑定到网格列宽度》经验,为你挑选了1个好方法。

我正在尝试将DependancyProperty我的一个用户控件绑定到Widtha Column中的a 属性Grid.

我有类似这样的代码:


    
        
        
    

    ...

    

在单独的Usercontrol中,我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属性的setter上设置断点,并使用GridSplitter控件调整第一列的大小,断点永远不会被命中.此外,当DependancyProperty TitleWidth更改未执行时,我希望代码被触发.

正在创建用户控件并将其添加到Window_Loaded函数中Grid中的Stackpanel .我希望在构建Usercontrols时渲染Grid.当然,x:Name'd元素TitleSection是可观察的,并且具有100在构造它们/在绑定发生之前的值.

编辑#2 - 可能与此有关?

我一直在围绕Grid ColumnDefinition文档的MSDN页面嗅到并且遇到了GridLength()但是我无法理解如何在绑定表达式中使用它.我不能在绑定代码中使用关联的GridLengthConverter作为转换器,因为它不是从IValueConverter派生的.

我倾向于以某种方式绑定到Grid对象中的一个单元格的ActualWidth属性.它似乎不像绑定到列定义一样干净,但目前我无法让它工作.



1> Ash..:

好吧,我有一点工作,我会解释为后代如何:

基本上我有一个2列,多行网格,在第一列中右侧对齐分割器,因此如果用户包含的内容需要更多空间,则可以由用户调整大小.为了使事情变得复杂,我将用户控件以编程方式加载到某些行中,其中columnSpan为2用于渲染目的(内容从一个单元格"流出"到下一个单元格中).

调整第一列的大小时,我需要将其反映在usercontrol中.首先,我尝试绑定到ColumnDefinition,但它确实没有玩球.

我如何修复/克服它

在第一列的备用单元格中,我添加了一个x:Name,以使其可访问.由于它在单元格中具有默认属性"拉伸"并完全填充单元格.当使用拆分器调整列大小时,它会调整大小.绑定到Label的ActualWidth属性意味着对列大小的更改将正确地传递到columnSpanned usercontrol中的DependancyProperty.

思考

显然,尽管ColumnDefinition ActualWidth在更改时具有属性,但它似乎不会在PropertyChanged内部触发事件(或者这是我最好的猜测).这可能是一个错误,或者是设计,但对我来说,这意味着我必须使用一个不太干净的解决方案.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有