1. 程式人生 > >wpf怎麼繫結多個值,多個控制元件

wpf怎麼繫結多個值,多個控制元件

最近有不少wpf新手問wpf的命令怎麼繫結多個控制元件,很多人為此絞盡腦汁,網上的答案找了也沒找到靠譜的,其實用MultiBinding就可以了。從.net 3.0版本開始,就支援MultiBinding

關於MultiBinding的說明:

https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.data.multibinding?redirectedfrom=MSDN&view=netframework-4.7.2

從msdn說明中我們得知,它需要一個值轉換Converter來實現多個引數繫結的邏輯,我們來實現以下,xaml程式碼如下:

 <Button  Text="繫結多值到命令"  Command="{Binding ImplementationCommand}"   >
                        <Button.CommandParameter>
                            <MultiBinding Converter="{StaticResource MultiBindingConverter}">
                                <Binding ElementName="MyTreeView
"/> <Binding ElementName="MyScrollViewer"/> </MultiBinding> </Button.CommandParameter> </Button>

需要注意的是,這裡是多值轉換,所以值轉換不是繼承介面IValueConverter,而是繼承介面IMultiValueConverter,和值轉換介面IValueConverter一樣,它需要實現Convert和ConvertBack方法。

上面我們宣告的值轉換MultiBindingConverter的實現:

   /// <summary>
    /// 繫結多引數的值轉換器
    /// </summary>
    public class MultiBindingConverter:IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return values.Clone();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

這樣我們就可以呼叫了,在命令的實現方法中我們可以這樣得到繫結的值:

 private void ImplementationInvoke(object obj)
{
    //從繫結值得到控制元件陣列
    var controlArray = (object[])obj;
     TreeView tv =(TreeView)controlArray[0];
      ScrollViewer viewer = (ScrollViewer)controlArray[1];   
}

所以多值繫結在wpf裡是很簡單的,別想得太難。如果想繫結三個值、四個值,甚至更多值,往多值轉換里加即可,此多值繫結的耦合性是比較低的。