Связывание данных WPF MVVM - в один конец? - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в WPF, но немного разбираюсь в MVVM, так что это то, что я реализовал.

UpdateTableView - просмотр (короткий фрагмент расширенного пользовательского элемента управления)

<UserContol.DataContext>
    <local:UpdateTableViewModel />
</UserContol.DataContext>

<StackPanel>
    <TextBox Text="{Binding InputPath}"/>
    <TextBlock Content="Placeholder" />
</StackPanel>

UpdateTableModel - модель

public class UpdateTableModel : ObservableObject
{
    private string _inputPath;

    public string InputPath
    {
        get
        {
            return _inputPath;
        }
        set
        {
            if (value != _inputPath)
            {
                _inputPath = value;
                OnPropertyChanged("InputPath");
            }
        }
    }
}

ObservableObject

public class ObservableObject : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanaged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanaged;
        if (handler != null)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

И пустой UpdateTableViewModel

class UpdateTableViewModel : ObservableObject { }

Мой вопрос заключается в том, как использовать привязку данных, чтобы в качестве пользователя, когда Я вписываю inputPath в текстовое поле, во-первых, все, что я набираю, сохраняется в свойстве _inputPath, чтобы я мог использовать его в коде позади и дополнительно отразить в текстовом блоке.

Я провел некоторое исследование и нашел одно- и двухстороннее связывание данных и не могу понять, что еще мне нужно добавить для желаемой функциональности.

Заранее спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Ваши модели представлений должны содержать свойства, с которыми вы хотите связать.

Как правило, свойство TextBox.Text автоматически связывает TwoWay. Это поведение по умолчанию. Таким образом, без указания Binding.Mode в явном виде текст, введенный в TextBox, будет автоматически отправлен в источник привязки. В вашем случае вход будет автоматически отправлен в свойство InputPath.

UpdateTableModel.cs

public class UpdateTableModel
{
  public void SaveUserNameToFile(string filePath, string userName)
  {
    File.AppendAllText(filePath, userName, Encoding.UTF8);
  }
}

UpdateTableViewModel.cs
Реализацию RelayCommand можно найти по адресу
Документы Microsoft: Шаблоны - Приложения WPF с шаблоном проектирования Model-View-ViewModel - Передача логи команд c

class UpdateTableViewModel : ObservableObject 
{ 
  private UpdateTableModel UpdateTableModel { get; }

  public ICommand SaveUserCommand => new RelayCommand(SaveUserName);

  private string _userName;
  public string UserName
  {
    get => _userName;
    set
    {
      if (value != _userName)
      {
        _userName = value;
        OnPropertyChanged(nameof(UserName));
      }
    }
  }

  private string _inputPath;
  public string InputPath
  {
    get => _inputPath;
    set
    {
      if (value != _inputPath)
      {
        _inputPath = value;
        OnPropertyChanged(nameof(InputPath));
      }
    }
  }

  public UpdateTableViewModel()
  {
    this.UpdateTableModel = new UpdateTableModel();
  }

  // Alternative constructor
  public UpdateTableViewModel(UpdateTableModel updateTableModel)
  {
    this.UpdateTableModel = updateTableModel;
  }

  private void SaveUserName(object param)
  {
    // Pass the data to the model
    this.UpdateTableModel.SaveUserNameToFile(this.InputPath, this.UserName);
  }
}

UpdateTableView.xaml

<UserControl>
  <UserContol.DataContext>
    <local:UpdateTableViewModel />
  </UserContol.DataContext>

  <StackPanel>
    <TextBox Text="{Binding UserName}" />
    <TextBox Text="{Binding InputPath}" />
    <Button Command="{Binding SaveUserCommand}" 
            Content="Save to File" />
  </StackPanel>
</UserControl>
...