【问题标题】:Set multibinding for a xaml element in code behind在后面的代码中为 xaml 元素设置多重绑定
【发布时间】:2011-07-30 09:15:33
【问题描述】:

我有以下工作 XAML 代码,它基本上绑定了几个属性来计算我的用户控件的最终位置:

<UserControl x:Class="CurvePointControl"
    ....
         >
<UserControl.Resources>
    <local:VToYConverter x:Key="vToYConverter" />
</UserControl.Resources>
<UserControl.RenderTransform>
    <TranslateTransform x:Name="XTranslateTransform" >
        <TranslateTransform.Y>
            <MultiBinding Converter="{StaticResource vToYConverter}">
                <Binding ElementName="curveEditPoint" Path="V"/>
                <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:CurveEditor}}" Path="MinV"/>
                <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:CurveEditor}}" Path="MaxV"/>
                <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:CurveEditor}}" Path="ActualHeight"/>                    
            </MultiBinding>
        </TranslateTransform.Y>
    </TranslateTransform>
</UserControl.RenderTransform>

...

出于各种原因(但特别是为了避免相对来源,我现在尝试在后面的代码中做同样的事情但没有成功。

这是我当前的代码:

    public CurvePointControl(CurveEditor CV)
    {
        InitializeComponent();

        MultiBinding multiBinding = new MultiBinding();
        multiBinding.Converter = m_VToYConverter;

        multiBinding.Bindings.Add(new Binding("V"));
        multiBinding.Bindings.Add(new Binding(CV.MinVProperty)); // doesn't work
        multiBinding.Bindings.Add(new Binding(CV.MaxVProperty)); // doesn't work
        multiBinding.Bindings.Add(new Binding(CV.ActualHeight)); // doesn't work       
        multiBinding.NotifyOnSourceUpdated= true;

        this.SetBinding(TranslateTransform.YProperty, multiBinding);
        //Doesn't work too:
        //BindingOperations.SetBinding(XTranslateTransform, TranslateTransform.YProperty, multiBinding);

    }

我仍然无法相信将 XAML 转换为 c# 代码如此困难。转换器只被调用一次,并且没有有效的属性值。

知道出了什么问题吗? 我怎么能调试这样的问题?

【问题讨论】:

    标签: c# wpf xaml data-binding properties


    【解决方案1】:

    您需要来源:

    multiBinding.Bindings.Add(new Binding("V") { Source = curveEditPoint }); //If that object is accessible in the current scope.
    multiBinding.Bindings.Add(new Binding("MinV") { Source = CV });
    multiBinding.Bindings.Add(new Binding("MaxV") { Source = CV });
    multiBinding.Bindings.Add(new Binding("ActualHeight") { Source = CV });
    

    【讨论】:

    • 现在工作得很好。我已经为这个问题苦苦挣扎了几个小时。令人惊讶的是,有多少人愿意在 Stackoverflow 上分享他们的专业知识。
    【解决方案2】:

    直译是:

    MultiBinding multiBinding = new MultiBinding();
    multiBinding.Converter = m_VToYConverter;
    
    RelativeSource relativeSource = new RelativeSource() { AncestorType = typeof(CurveEditor) };
    
    multiBinding.Bindings.Add(new Binding("V") { ElementName = "curveEditPoint" });
    multiBinding.Bindings.Add(new Binding(CV.MinVProperty) { RelativeSource = relativeSource });
    multiBinding.Bindings.Add(new Binding(CV.MaxVProperty) { RelativeSource = relativeSource });
    multiBinding.Bindings.Add(new Binding(CV.ActualHeight) { RelativeSource = relativeSource });
    

    但是您可能会遇到正确解析 ElementName 的问题。在这种情况下,您必须直接绑定到元素或“找到”它。如果 curveEditPoint 是当前类中的一个字段,这样的事情会起作用:

    multiBinding.Bindings.Add(new Binding("V") { Source = this.curveEditPoint });
    

    【讨论】:

    • 虽然这个答案作为未来的参考非常有用,但它并不是我一直追求的,因为我试图避免相对绑定。我希望相对绑定将负责创建 UserControls 所需的大量时间(每个元素 10 毫秒)。用 c# 而不是 XAML 创建实例只节省了 10%。
    • @pixtur - 啊,没问题。我错过了你问题的那一部分。
    【解决方案3】:

    尝试使用

    multiBinding.Bindings.Add(new Binding("MinVProperty") { ElementName = CV.Name });
    

    而不是

    multiBinding.Bindings.Add(new Binding("CV.MinVProperty"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2019-03-07
      • 2014-09-02
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多