數據綁定(十一)多路綁定MultiBinding

有時候UI要顯示的信息又不止一個數據來源決定,就需要使用MultiBinding,MultiBinding具有一個名爲Bindings的屬性,其類型是Collection<BindingBase>,通過這個屬性MultiBinding把一組Binding對象聚合起來,處在這個集合中的Binding對象可以擁有自己的數據校驗與轉換機制,它們彙集起來的數據將共同決定傳往MultiBinding目標的數據。

舉例:有如下界面

    <StackPanel Background="LightBlue">
        <TextBox x:Name="textBox1" Height="23" Margin="5" />
        <TextBox x:Name="textBox2" Height="23" Margin="5,0" />
        <TextBox x:Name="textBox3" Height="23" Margin="5" />
        <TextBox x:Name="textBox4" Height="23" Margin="5" />
        <Button x:Name="button1" Content="Submit" Width="80" Margin="5" />
    </StackPanel>

後臺代碼中設置MultiBinding

            Binding b1 = new Binding("Text") { Source = textBox1 };
            Binding b2 = new Binding("Text") { Source = textBox2 };
            Binding b3 = new Binding("Text") { Source = textBox3 };
            Binding b4 = new Binding("Text") { Source = textBox4 };

            MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };
            mb.Bindings.Add(b1);
            mb.Bindings.Add(b2);
            mb.Bindings.Add(b3);
            mb.Bindings.Add(b4);
            mb.Converter = new LogonMultiBindingConverter();
            button1.SetBinding(Button.IsEnabledProperty, mb);
轉換器由於需要對多個值進行轉換,所以需要使用IMultiValueConverter的派生類進行轉換,轉換器代碼

    class LogonMultiBindingConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (!values.Cast<string>().Any(Text => string.IsNullOrEmpty(Text)) 
                && values[0].ToString() == values[1].ToString() 
                && values[2].ToString() == values[3].ToString())
            {
                return true;
            }

            return false;
        }

        public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

運行效果如圖

當第一行和第二行的內容相同,並且,第三行和第四行的內容相同時,Submit按鈕可用,否則Submit不可用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章