WPF - 将文本框的内容绑定到其他文本框中

时间:2016-12-02 10:28:10

标签: c# wpf mvvm

我有两个文本框,它们在wpf mvvm中独立工作。但现在我想基于一个复选框将一个文本框的输入绑定到其他文本框。

  <Label Grid.Row="4" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">First Name:</Label>
  <TextBox Grid.Row="4" MaxLength="10" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding FirstName}" Grid.ColumnSpan="2" Margin="0,1,0,11" />

  <Label  Grid.Row="5" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">Last Name:</Label>
  <TextBox Grid.Row="5" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding LastName}" AcceptsReturn="True" Grid.ColumnSpan="2" Margin="0,1,0,11" />
  <CheckBox Content="CopyFirstNameToLast" />

因此,当我选中复选框时,它会将名字重新复制到姓氏。如果没有代码,我能做到这一点。如果是,那么如何?

2 个答案:

答案 0 :(得分:2)

当您遵循MVVM模式来实现您的应用程序时,您应该注意到MVVM pattern guide根据{strong>不的视图应包含任何应用程序逻辑:

  

视图负责定义结构,布局和   用户在屏幕上看到的内容。理想情况下,观点是   完全由XAML定义,但有限的代码隐藏却没有   包含业务逻辑。

FirstName复制到LastName 是应用程序逻辑的一部分,因此您应该将此任务委派给ViewModel。

再次引用MSDN:

  

视图模型充当视图和模型之间的中介,   并负责处理视图逻辑。

这正是你想要实现的目标。

为了保持整洁,您应该在ViewModel中定义FirstNameLastName属性,这些属性将绑定到View的TextBoxes,就像您在问题中的代码中所做的那样:

// ViewModel
public const string FirstNamePropertyName = "FirstName";
private string _firstName = null;
public string FirstName
{
    get
    {
        return _firstName;
    }

    set
    {
        _firstName = value;
        RaisePropertyChanged(FirstNamePropertyName);
    }
}

public const string LastNamePropertyName = "LastName";
private string _lastName = null;
public string LastName
{
    get
    {
        return _lastName;
    }

    set
    {
        _lastName = value;
        RaisePropertyChanged(LastNamePropertyName);
    }
}

<!-- XAML -->

<Label Grid.Row="4" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">First Name:</Label>
<TextBox Grid.Row="4" MaxLength="10" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding FirstName}" Grid.ColumnSpan="2" Margin="0,1,0,11" />

<Label  Grid.Row="5" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">Last Name:</Label>
<TextBox Grid.Row="5" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding LastName}" AcceptsReturn="True" Grid.ColumnSpan="2" Margin="0,1,0,11" />

虽然可以通过两种方式处理CheckBox:

  • 将其Checked事件绑定到ViewModel的命令 操纵您的FirstNameLastName属性,并将复选框的IsChecked属性值作为命令参数(硬路)传递给它
  • IsChecked属性绑定到ViewModel的布尔属性和 处理你的setter中的逻辑(简单方法)

所以要做到这一点很简单:

// ViewModel
public const string CheckedPropertyName = "Checked";
private bool _checked = false;
public bool Checked
{
    get
    {
        return _checked;
    }

    set
    {
        _checked = value;
        RaisePropertyChanged(CheckedPropertyName);

        // app logic is handled here
        if (_checked)
        {
            LastName = FirstName;
        }
    }
}

<!-- XAML -->
<CheckBox IsChecked="{Binding Checked}" />

答案 1 :(得分:2)

没有代码:

 <Label>First Name:</Label>
 <TextBox x:Name="txtFirstName" Width="100" MaxLength="10" Text="{Binding FirstName}" />
<Label >Last Name:</Label>
  <TextBox Width="100">
     <TextBox.Style>
                <Style TargetType="TextBox">
                    <Setter Property="Text" Value="{Binding LastName}" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=chk, Path=IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Value="True">
                            <Setter Property="Text" Value="{Binding ElementName=txtFirstName, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
        <CheckBox x:Name="chk" Content="CopyFirstNameToLast" />