WPF應用Binding之MultiBinding
阿新 • • 發佈:2019-02-15
有時目標繫結多個源的資料,此時需要使用多路繫結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();
}
}