[英]How do I bind a XAML TextBox to either another TextBox's input or its own input, and then save the input to the data object in MVVM?
我有 2 对用于用户输入的文本框(请参阅下面的 XAML)。 在绝大多数情况下,A1 和 A2 的输入将与 B1 和 B2 相同,因此我添加了txtDataB1
和txtDataB2
的绑定以“镜像”到 A1 和 A2 的输入,这在 UI 中有效。 输入到 A1/A2 的数据保存得很好,因为它绑定到dataStore
,但我有一些问题:
如何将在txtDataB1
和txtDataB2
输入的值(来自手动用户输入或来自 A1/A2 的镜像数据)保存到dataStore
对象? 我对 XAML/MVVM/etc 不够熟悉,不知道是否有使用 MultiBindings 或其他东西执行此操作的“纯 XAML”方式,或者是否有一些我必须在视图模型中创建/调用的逻辑。
<!-- Data A -->
<TextBox Name="txtDataA1" Text="{Binding dataStore.A1}" />
<TextBox Name="txtDataA2" Text="{Binding dataStore.A2}" />
<!-- Data B -->
<TextBox Name="txtDataB1" Text="{Binding ElementName=txtDataA1, Path=Text, Mode=OneWay}" />
<TextBox Name="txtDataB2" Text="{Binding ElementName=txtDataA2, Path=Text, Mode=OneWay}" />
忘记尝试在“纯 XAML”中应用程序实现这样的逻辑,而是在视图模型中实现它。 XAML 是一种标记语言。
A1
的 setter 应该设置B1
并且A2
的 setter 应该设置B2
,例如:
public class ViewModel : INotifyPropertyChanged
{
private string _a1;
public string A1
{
get { return _a1; }
set { _a1 = value; NotifyPropertyChanged(); B1 = value; }
}
private string _b1;
public string B1
{
get { return _b1; }
set { _b1 = value; NotifyPropertyChanged(); }
}
//+the same for A2 and B2
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML:
保存数据只是从B1
和B2
属性中获取值的问题,而不管它们是如何设置的。
这可以通过使用 TwoWay 绑定来解决,但是 TextBox 默认是由LostFocus
更新的,还需要改变它的UpdateSourceTrigger
,代码如下:
<!-- Data A -->
<TextBox Name="txtDataA1" Text="{Binding dataStore.A1, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Name="txtDataA2" Text="{Binding dataStore.A2, UpdateSourceTrigger=PropertyChanged}"/>
<!-- Data B -->
<TextBox Name="txtDataB1" Text="{Binding ElementName=txtDataA1, Path=Text, Mode=TwoWay}" />
<TextBox Name="txtDataB2" Text="{Binding ElementName=txtDataA2, Path=Text, Mode=TwoWay}" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.