繁体   English   中英

如何将 XAML 文本框绑定到另一个文本框的输入或它自己的输入,然后将输入保存到 MVVM 中的数据对象?

[英]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 相同,因此我添加了txtDataB1txtDataB2的绑定以“镜像”到 A1 和 A2 的输入,这在 UI 中有效。 输入到 A1/A2 的数据保存得很好,因为它绑定到dataStore ,但我有一些问题:

如何将在txtDataB1txtDataB2输入的值(来自手动用户输入或来自 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:

保存数据只是从B1B2属性中获取值的问题,而不管它们是如何设置的。

这可以通过使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM