我有两个文本框,它们在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" />
因此,当我选中复选框时,它会将名字重新复制到姓氏。如果没有代码,我能做到这一点。如果是,那么如何?
答案 0 :(得分:2)
当您遵循MVVM模式来实现您的应用程序时,您应该注意到MVVM pattern guide根据{strong>不的视图应包含任何应用程序逻辑:
视图负责定义结构,布局和 用户在屏幕上看到的内容。理想情况下,观点是 完全由XAML定义,但有限的代码隐藏却没有 包含业务逻辑。
将FirstName
复制到LastName
是应用程序逻辑的一部分,因此您应该将此任务委派给ViewModel。
再次引用MSDN:
视图模型充当视图和模型之间的中介, 并负责处理视图逻辑。
这正是你想要实现的目标。
为了保持整洁,您应该在ViewModel中定义FirstName
和LastName
属性,这些属性将绑定到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的命令
操纵您的FirstName
和LastName
属性,并将复选框的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" />