Как связать XBL TextBox с другим вводом TextBox или с его собственным вводом, а затем сохранить ввод в объект данных в MVVM? - PullRequest
1 голос
/ 07 марта 2019

У меня есть 2 пары текстовых полей для пользовательского ввода (см. XAML ниже).В подавляющем большинстве случаев вход для A1 и A2 будет идентичен B1 и B2, поэтому я добавил привязки для txtDataB1 и txtDataB2, чтобы «отразить» ввод для A1 и A2, что работаетв пользовательском интерфейсе.Данные, введенные в A1 / A2, хорошо сохраняются, поскольку они привязаны к dataStore, но у меня есть некоторые проблемы:

Как сохранить значения, введенные в txtDataB1 и txtDataB2 (либо из ручного ввода пользователяили зеркальные данные от A1 / A2) до объекта dataStore?Я не достаточно знаком с XAML / MVVM / и т. Д., Чтобы знать, есть ли «чистый XAML» способ сделать это с помощью MultiBindings или что-то в этом роде, или есть какая-то логика, которую я должен был бы создать / вызвать в модели представления.

<!-- 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}" />

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Забудьте о попытке приложения реализовать логику, подобную этой, в «чистом XAML» и вместо этого реализовать ее в модели представления. XAML - это язык разметка .

Установщик A1 должен установить B1, а установщик A2 должен установить 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, независимо от того, как они были установлены.

0 голосов
/ 07 марта 2019

Эту проблему можно решить с помощью привязки 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}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...