Установить мультисвязывание для элемента xaml в коде позади - PullRequest
5 голосов
/ 06 апреля 2011

У меня есть следующий рабочий код 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 # очень сложно. Преобразователь вызывается, но только один раз и без допустимых значений свойств.

Есть идеи, что не так? Как я могу отладить такую ​​проблему?

Ответы [ 3 ]

9 голосов
/ 06 апреля 2011

Вам нужны источники:

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 });
1 голос
/ 06 апреля 2011

Дословный перевод будет выглядеть так:

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 });
0 голосов
/ 06 апреля 2011

Попробуйте использовать

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

вместо

multiBinding.Bindings.Add(new Binding("CV.MinVProperty"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...