C# 多重绑定选择参数
我有一个带有文本框的窗口。填写此表单有两个模板(两组数据)。用户单击单选按钮并选择模板。之后,文本框由模板中的数据填充C# 多重绑定选择参数,c#,wpf,binding,C#,Wpf,Binding,我有一个带有文本框的窗口。填写此表单有两个模板(两组数据)。用户单击单选按钮并选择模板。之后,文本框由模板中的数据填充 <Window x:Class="WpfTestApplication.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title=
<Window x:Class="WpfTestApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" SizeToContent="Height" Width="500">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="35"></RowDefinition>
<RowDefinition Height="35"></RowDefinition>
<RowDefinition Height="35"></RowDefinition>
<RowDefinition Height="35"></RowDefinition>
<RowDefinition Height="35"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.ColumnSpan="2" Orientation="Horizontal">
<RadioButton GroupName="Templates" Content="Template1" IsChecked="True"></RadioButton>
<RadioButton GroupName="Templates" Content="Template2"></RadioButton>
</StackPanel>
<Label Grid.Row="1" Grid.Column="0">Field1</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="TbField1"></TextBox>
<Label Grid.Row="2" Grid.Column="0">Field2</Label>
<TextBox Grid.Row="2" Grid.Column="1" Name="TbField2"></TextBox>
<Label Grid.Row="3" Grid.Column="0">Field3</Label>
<TextBox Grid.Row="3" Grid.Column="1" Name="TbField3"></TextBox>
<Button Grid.Row="4" Grid.ColumnSpan="2" Name="BtnGetData" Content="GetData" Click="BtnGetData_Click"></Button>
</Grid>
字段1
字段2
字段3
公共部分类主窗口:窗口
{
私有静态数据集test data1;
私有静态数据集测试数据2;
私有静态数据绑定;
公共主窗口()
{
初始化组件();
data1=新数据集(“field1_1”、“field2_1”、“field3_1”);
data2=新数据集(“field1_2”、“field2_2”、“field3_2”);
绑定=新的数据绑定();
添加(TbField1,data1,“Field1”,data2,“Field1”);
添加(TbField2,data1,“Field2”,data2,“Field2”);
添加(TbField3,data1,“Field3”,data2,“Field3”);
bindings.SetData();
}
私有无效BtnGetData_单击(对象发送方,路由目标)
{
bindings.GetData();
MessageBox.Show(data1.Field1);
}
}
公共类数据集
{
公共字符串字段1{get;set;}
公共字符串字段2{get;set;}
公共字符串字段3{get;set;}
公共数据集()
{
}
公共数据集测试(字符串字段1、字符串字段2、字符串字段3)
{
Field1=Field1;
Field2=Field2;
Field3=Field3;
}
}
公共类数据记录
{
列表绑定=新列表();
私有绑定AddBinding(字符串propertyName,对象数据)
{
绑定b=新绑定(propertyName);
b、 Mode=BindingMode.TwoWay;
b、 来源=数据;
b、 ConverterCulture=CultureInfo.CurrentCulture;
b、 NotifyOnSourceUpdated=false;
b、 NotifyOnTargetUpdated=false;
返回b;
}
私有多绑定AddMultiBinding(字符串propertyName1、对象data1、对象data2、字符串propertyName2)
{
MultiBinding mb=新的MultiBinding();
mb.Converter=新的自定义多值转换器();
mb.UpdateSourceTrigger=UpdateSourceTrigger.Explicit;
绑定b=AddBinding(propertyName1,data1);
mb.Bindings.Add(b);
b=添加绑定(propertyName2,data2);
mb.Bindings.Add(b);
返回mb;
}
公共void添加(文本框控件、对象数据1、字符串propertyName1、对象数据2、字符串propertyName2)
{
MultiBinding b=AddMultiBinding(propertyName1、data1、data2、propertyName2);
BindingExpressionBase be=BindingOperations.SetBinding(控件,TextBox.TextProperty,b);
bindings.Add(be);
}
public void SetData()
{
foreach(绑定中的BindingExpressionBase b)
{
b、 UpdateTarget();
}
}
public void GetData()
{
foreach(绑定中的BindingExpressionBase b)
{
b、 UpdateSource();
}
}
}
公共类CustomMultiValueConverter:IMMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
返回值[0];
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
返回值作为对象[];
}
}
类数据绑定包含用于添加多重绑定的方法,并将数据插入textbox或从中获取数据。
但是,如何将参数从RadioButton发送到multibinding以选择第一个或第二个绑定?如果没有e,就不可能知道什么是适合您的场景的最佳设计。您在这里没有提供太多的上下文,这必然会限制我们对您的代码的了解。也就是说
您可以设置MultiBinding.ConverterParameter
属性;这将设置作为Convert()
和ConvertBack()
方法的参数参数传递的值
但请注意,您不能将其绑定到任何东西;它只能设置为某个特定值。因此,您必须根据您的广播组的状态显式地更新它。考虑到这一点,可能更合理的做法是不必担心转换器,也不必担心多重绑定本身,只需根据单选按钮选择更新绑定本身
也就是说,当单选按钮选择更改时,只需根据选择将propertyName1
或propertyName2
绑定到所需的Text
属性
当然,有可能有一种更好的、XAML声明的方法来完成您想要做的事情。同样,如果没有一个好的代码示例,对这一点进行推测是不现实的。如果上面的内容看起来不像你真正想要做的那样,请考虑通过提供一个更好的代码示例,清楚地描述代码示例所做的事情,以及它与你想要做的事情的不同。
public partial class MainWindow : Window
{
private static DataSetTest data1;
private static DataSetTest data2;
private static DataBingings bindings;
public MainWindow()
{
InitializeComponent();
data1 = new DataSetTest("field1_1", "field2_1", "field3_1");
data2 = new DataSetTest("field1_2", "field2_2", "field3_2");
bindings = new DataBingings();
bindings.Add(TbField1, data1, "Field1", data2, "Field1");
bindings.Add(TbField2, data1, "Field2", data2, "Field2");
bindings.Add(TbField3, data1, "Field3", data2, "Field3");
bindings.SetData();
}
private void BtnGetData_Click(object sender, RoutedEventArgs e)
{
bindings.GetData();
MessageBox.Show(data1.Field1);
}
}
public class DataSetTest
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public DataSetTest()
{
}
public DataSetTest(string field1, string field2, string field3)
{
Field1 = field1;
Field2 = field2;
Field3 = field3;
}
}
public class DataBingings
{
List<BindingExpressionBase> bindings = new List<BindingExpressionBase>();
private Binding AddBinding(string propertyName, object data)
{
Binding b = new Binding(propertyName);
b.Mode = BindingMode.TwoWay;
b.Source = data;
b.ConverterCulture = CultureInfo.CurrentCulture;
b.NotifyOnSourceUpdated = false;
b.NotifyOnTargetUpdated = false;
return b;
}
private MultiBinding AddMultiBinding(string propertyName1, object data1, object data2, string propertyName2)
{
MultiBinding mb = new MultiBinding();
mb.Converter = new CustomMultiValueConvertor();
mb.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
Binding b = AddBinding(propertyName1, data1);
mb.Bindings.Add(b);
b = AddBinding(propertyName2, data2);
mb.Bindings.Add(b);
return mb;
}
public void Add(TextBox control, object data1, string propertyName1, object data2, string propertyName2)
{
MultiBinding b = AddMultiBinding(propertyName1, data1, data2, propertyName2);
BindingExpressionBase be = BindingOperations.SetBinding(control, TextBox.TextProperty, b);
bindings.Add(be);
}
public void SetData()
{
foreach (BindingExpressionBase b in bindings)
{
b.UpdateTarget();
}
}
public void GetData()
{
foreach (BindingExpressionBase b in bindings)
{
b.UpdateSource();
}
}
}
public class CustomMultiValueConvertor : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return value as object[];
}
}