查看属性 - 绑定两次

时间:2016-03-17 13:18:03

标签: c# wpf mvvm binding

是否可以多次绑定控件的相同属性?

例如:

<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 个答案:

答案 0 :(得分:1)

您可以简单地使用MultiBinding和转换器来实现您想要的逻辑。

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

我通常把这个逻辑放在ViewModel中,但因为它是一个AttachedProperty,所​​以直接在View中的东西对我来说更合适。