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[];
    }
}