Как связать с суммой двух значений данных в WPF? - PullRequest
2 голосов
/ 05 января 2011

Я разработал аналоговое управление часами.Он использует обводку из двух эллипсов, чтобы представить внешнюю границу и внутреннюю границу циферблата.

Clock control

У меня есть свойства в UserControl, которые позволяют пользователю изменятьтолщина этих двух границ.Свойства Ellipse.StrokeThickness затем привязываются к этим свойствам UserControl.В данный момент я связываю свойство UserControl для толщины внешней границы с полями внутренних элементов, чтобы они не были скрыты при увеличении размера границы.

<Ellipse Name="OuterBorder" Panel.ZIndex="1" StrokeThickness="{Binding OuterBorderThickness,
ElementName=This}" Stroke="{StaticResource OuterBorderBrush}" />
<Ellipse Name="InnerBorder" Panel.ZIndex="5" StrokeThickness="{Binding InnerBorderThickness,
ElementName=This}" Margin="{Binding OuterBorderThickness, ElementName=This}"
Stroke="{StaticResource InnerBorderBrush}">
...
<Ellipse Name="Face" Panel.ZIndex="1" Margin="{Binding OuterBorderThickness, ElementName=This}"
Fill="{StaticResource FaceBackgroundBrush}" />
...

Проблема заключается в том, что еслиТолщина внутренней границы увеличивается, это не влияет на поля, поэтому отметки и цифры часов могут быть частично скрыты или скрыты.Поэтому мне действительно нужно связать свойства полей внутренних элементов управления с суммой значений толщины внутренней и внешней границ (они имеют тип double).

Я сделал это успешно, используя 'DataContext = this; ', но я пытаюсь переписать элемент управления без этого, поскольку слышу, что это не рекомендуется.Я также думал об использовании конвертера и передаче второго значения в качестве ConverterParameter, но не знал, как привязать к ConverterParameter.Любые советы будут с благодарностью.

РЕДАКТИРОВАТЬ >>

Благодаря предложению Кента, я создал простой MultiConverter для добавления входных значений и возврата результата.Я подключил ОДНО ЖЕ мультисвязывание с конвертером XAML и к свойству TextBlock.Text, и к свойству TextBlock.Margin, чтобы проверить его.

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource SumConverter}" ConverterParameter="Add">
            <Binding Path="OuterBorderThickness" ElementName="This" />
            <Binding Path="InnerBorderThickness" ElementName="This" />
        </MultiBinding>
    </TextBlock.Text>
    <TextBlock.Margin>
        <MultiBinding Converter="{StaticResource SumConverter}" ConverterParameter="Add">
            <Binding Path="OuterBorderThickness" ElementName="This" />
            <Binding Path="InnerBorderThickness" ElementName="This" />
        </MultiBinding>
    </TextBlock.Margin>
</TextBlock>

Я вижу правильное значение, отображаемое в TexBlock, но Marginне установлен.Любые идеи?

РЕДАКТИРОВАТЬ >> >>

Интересно, что свойство Margin может быть связано со свойством данных типа double, но это, похоже, не применяется в MultiBinding.По совету Кента я изменил конвертер, чтобы он возвращал значение как объект «Толщина», и теперь он работает.Спасибо Кент.

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Звучит так, будто вы ищете MultiBinding с конвертером, способным оценить выражение.Мой ExpressionConverter разрешает именно это.Конечно, если вы не хотите зависеть от сторонней библиотеки только для этого, вы можете написать свой собственный многозначный преобразователь, который добавляет два значения вместе.

0 голосов
/ 05 января 2011

Я сделал это успешно, используя 'DataContext = this;', но пытаюсь переписать элемент управления без этого, поскольку слышу, что это не рекомендуется.

Вы можете привязать к свойствампользовательского элемента управления без изменения его DataContext;просто добавьте атрибут x:Name к его корневому элементу и затем выполните привязку, используя {Binding ElementName=Root, Path=MyProperty}.Это гораздо проще сделать, чем использовать конвертеры для внедрения кода в привязку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...