Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据条件将C#WPF文本框绑定到不同的属性?_C#_Wpf_Binding - Fatal编程技术网

如何根据条件将C#WPF文本框绑定到不同的属性?

如何根据条件将C#WPF文本框绑定到不同的属性?,c#,wpf,binding,C#,Wpf,Binding,如何让我的文本框根据用户选择绑定到不同的属性。我的设想是: 客户具有以下属性: 通讯地址及 送货地址 编辑或创建这些地址时,有一个单选按钮用于选择要编辑的地址。因此,当我单击“邮寄地址”单选按钮时,我想将文本框绑定到属性“maildaddress”,但当单击配送地址时,我想将绑定更改为“shipdaddress”属性 我知道我可以在单击单选按钮时设置属性“Address”,但我想直接绑定到Customer.maildaddress或Customer.ShipAddress,以进行验证(需要邮件地

如何让我的文本框根据用户选择绑定到不同的属性。我的设想是:

客户具有以下属性:

  • 通讯地址及
  • 送货地址 编辑或创建这些地址时,有一个单选按钮用于选择要编辑的地址。因此,当我单击“邮寄地址”单选按钮时,我想将文本框绑定到属性“
    maildaddress
    ”,但当单击配送地址时,我想将绑定更改为“
    shipdaddress
    ”属性


    我知道我可以在单击单选按钮时设置属性“
    Address
    ”,但我想直接绑定到
    Customer.maildaddress
    Customer.ShipAddress
    ,以进行验证(需要邮件地址,但不需要发货地址).

    您可以在回调radiobutton选中的事件时执行此操作

    比如:

    Binding b = new Binding("ShippingAddress");
    _textBox.SetBinding(TextBox.TextProperty, b);
    

    首先,我想说我自己不会这么做,但直接回答你的问题,你可以这样做:

    <TextBox Name="YourTextBox">
        <TextBox.Style>
            <Style>
                <Setter Property="TextBox.Text" Value="{Binding MailAddress}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsChecked, ElementName=TheRadioButton}" 
                        Value="True">
                        <Setter Property="TextBox.Text" Value="{Binding ShipAddress}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
    
    
    

    我个人会将这些控件放入一个
    UserControl
    中,我可以绑定到该控件,甚至将我的控件加倍,对所有
    Binding
    s进行硬编码,然后使用
    复选框。IsChecked
    属性值可以切换它们的
    可见性。它可能会产生更多的代码,但会更干净,更容易调试。无论哪种方式,都取决于您。

    我建议使用两个单独的文本框,并将它们的可见性绑定到广播框,以便您可以分别绑定和验证这两个属性

    <Window.Resource>
        <ResourceDictionary>
        <BooleanToVisibilityConverter x:Key="BoolVisiConv"/>
        </ResourceDictionary>
    </Window.Resource>
    <RadioButton Name="RdBoxMailing"/> <RadioButton Name="RdBoxShipping"/>
    <TextBox Text="{Binding MailAddress}" Visibility="{Binding IsChecked, ElementName="RdBoxMailing", Converter={StaticResource BoolVisiConv}}"/>
    <TextBox Text="{Binding ShipAddress}" Visibility="{Binding IsChecked, ElementName="RdBoxShipping", Converter={StaticResource BoolVisiConv}}"/>
    
    
    
    听起来是个非常糟糕的主意。为什么听起来是个非常糟糕的主意?因为您没有在过程代码中设置绑定。时期见我上面的评论。您的解决方案需要使用业务逻辑来确定要绑定到
    code-behind
    中的属性。这是一个非常糟糕的主意。他的问题是当点击复选框时如何更改绑定,而不是这样做是否是一个好主意。@franssu我同意HighCore。最好坚持使用MVVM模式,不要在代码背后进行绑定。OP是否实现了MVVM完全是另一个问题,如果他没有实现,你的答案可能是最好的选择。在ViewModel中放置一个名为
    public string TextToShow
    的属性,并根据您的逻辑进行设置。简单一点。@HighCore可能是错的,但我不认为他在处理MVVM。我更喜欢这种方式,因为它避免了重复。考虑当您想要应用另一种样式或处理代码后面的文本框时会发生什么——您需要将样式和代码应用到这两个控件,而这里您可以只处理一个并使用样式。最后,我只是将文本框对折,并将它们的可见性绑定到选中的单选按钮。但所展示的风格也起了作用。谢谢谢里登!