WPF应用Binding之MultiBinding

来源:互联网 发布:温州淘宝运营培训 编辑:程序博客网 时间:2024/06/02 21:19

有时目标绑定多个源的数据,此时需要使用多路绑定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();        }    }



2 0
原创粉丝点击