1. 程式人生 > >WPF應用Binding之MultiBinding

WPF應用Binding之MultiBinding

有時目標繫結多個源的資料,此時需要使用多路繫結MultiBinding。

本例4個TextBox(textBox1, textBox2, textBox3, textBox4)及一個按鈕,當textBox1與textBox2內容相同,並且textBox3與textBox4內容相同時,Button有效。

一、方式一(通過C#進行繫結)

1. xaml

    <Grid>
        <StackPanel>
            <TextBox x:Name="TextBox1" Margin="5"/>
            <TextBox x:Name="TextBox2" Margin="5"/>
            <TextBox x:Name="TextBox3" Margin="5"/>
            <TextBox x:Name="TextBox4" Margin="5"/>
            <Button x:Name="btn_Commit" Content="Commit" Margin="5" Click="btn_Commit_Click" />
        </StackPanel>
    </Grid>

2. C#邏輯

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            SetMultiBinding();
        }

        private void btn_Commit_Click(object sender, RoutedEventArgs e)
        {

        }

        private void SetMultiBinding()
        {
            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 };
            /* MultiBinding對Add順序敏感 */
            mb.Bindings.Add(b1);
            mb.Bindings.Add(b2);
            mb.Bindings.Add(b3);
            mb.Bindings.Add(b4);

            mb.Converter = new MultiBindingConvert();

            btn_Commit.SetBinding(Button.IsEnabledProperty, mb);
        }
    }

    /* 多路繫結資料轉換 */
    public class MultiBindingConvert : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.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[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

二、方式二(通過XAML繫結)

1. xaml

<Window.Resources>
        <local:LogonButtonEnableConvert x:Key="lbec"/>
    </Window.Resources>
    
    <Grid>
        <StackPanel>
            <TextBox x:Name="TextBox1" Margin="5"/>
            <TextBox x:Name="TextBox2" Margin="5"/>
            <TextBox x:Name="TextBox3" Margin="5"/>
            <TextBox x:Name="TextBox4" Margin="5"/>
            <Button x:Name="btn_Commit" Content="Commit" Margin="5" Click="btn_Commit_Click">
                <Button.IsEnabled>
                    <MultiBinding Converter="{StaticResource lbec}" ConverterParameter="ParamTest">
                        <Binding ElementName="TextBox1" Path="Text"/>
                        <Binding ElementName="TextBox2" Path="Text"/>
                        <Binding ElementName="TextBox3" Path="Text"/>
                        <Binding ElementName="TextBox4" Path="Text"/>
                    </MultiBinding>
                </Button.IsEnabled>
            </Button>
        </StackPanel>
    </Grid>

2、C#資料轉換類
    public class LogonButtonEnableConvert : IMultiValueConverter
    {
        /*
         * object[] values                          : 所繫結的源的值
         * Type targetType                          : 目標的型別
         * object parameter                         : 繫結時所傳遞的引數
         * System.Globalization.CultureInfo culture : 系統語言等資訊
         */
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.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[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }