Просмотр собственности - связать дважды

Можно ли связать одно и то же свойство элемента управления более одного раза?

К примеру:

<Popup IsOpen="{Binding Path=(local:ListViewBehavior.IsColumnHeaderClicked),
    RelativeSource={RelativeSource FindAncestor,  AncestorType=GridViewColumnHeader}}" ...

Как вы видете Popup.IsOpen связан с прикрепленной собственностью. Я хотел бы привязать его к ViewModel IsPopupOpened, но понятия не имею, как.


Попытка ответа @Arhiman без особого успеха:

<Popup.IsOpen>
    <MultiBinding Converter="{local:MultiBindingConverter}">
        <Binding Path="(local:ListViewBehavior.IsColumnHeaderClicked)"
                 RelativeSource="{RelativeSource FindAncestor, AncestorType=GridViewColumnHeader}" />
        <Binding Path="DataContext.IsPopupId"
                 RelativeSource="{RelativeSource FindAncestor, AncestorType=UserControl}" />
    </MultiBinding>
</Popup.IsOpen>

Наивный конвертер логики:

public class MultiBindingConverter : MarkupExtension, IMultiValueConverter
{
    public MultiBindingConverter() { }

    public override object ProvideValue(IServiceProvider serviceProvider) => this;

    object[] _old;

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (_old == null)
            _old = values.ToArray();
        // check if one of values is changed - that change is a new value
        for (int i = 0; i < values.Length; i++)
            if (values[i] != _old[i])
            {
                _old = values.ToArray();
                return values[i];
            }
        return values[0];
    }

    // replicate current value
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) =>
        Enumerable.Repeat(value, targetTypes.Length).ToArray();
}

1 ответ

Вы можете просто использовать MultiBinding с конвертером для реализации желаемой логики.

<Popup.IsOpen>
    <MultiBinding Converter="{StaticResource openLogicConverter}">
        <Binding Path="MyAttachedProperty" ... />
        <Binding Path="IsPopupOpened" />
    </MultiBinding>
</Popup.IsOpen>

Я бы обычно помещал эту логику во ViewModel, но поскольку это AttachedProperty, то что-то непосредственно в View кажется мне более подходящим.

Другие вопросы по тегам