Содержимое WPF TextBox на уровне модели с использованием MVVM - PullRequest
0 голосов
/ 05 мая 2018

Как сохранить содержимое TextBox в слое модели, чтобы оно соответствовало MVVM?

Я сделал простое демонстрационное приложение для практики MVVM. Он состоит из основного TextBox и 2 дополнительных TextBox для проверки правильности работы приложения.

В ViewModel у меня есть класс TextContent, который реализует INotifyPropertyChanged, и он имеет свойство Text, и к нему привязан текст MainTextBox, и он работает правильно.

В Model у меня есть свойство TextStore, которое я пытаюсь обновить в установщике свойства Text из ViewModel.TextContent, используя простой метод ModelUpdate ().

И это обновление модели не работает.

Не могли бы вы сказать мне, как я могу перенести содержимое TextBox, которое хранится в свойстве ViewModel, на слой Model? А в очереди в MVVM шаблон?

Вот код:

Представление: (Здесь третий TextBox привязан к модели - я знаю, это несовместимо с идеей MVVM, но это только для проверки значения свойства TextStore из слоя Model)

 <Window x:Class="MVVM_TBDB_2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:MVVM_TBDB_2"
            xmlns:vm="clr-namespace:MVVM_TBDB_2.ViewModel"
            xmlns:m="clr-namespace:MVVM_TBDB_2.Model"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <m:TextContent x:Key="ModelTextContent" />
        </Window.Resources>
        <Window.DataContext>
            <vm:TextContent />
        </Window.DataContext>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="8*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <TextBox Name="MainTB" Grid.Row="0" Margin="10" AcceptsReturn="True" 
                    Text="{Binding Text, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"/>
            <Button Name="SaveButton" Content="Save" Grid.Row="1" Margin="10,2" Padding="20,0" HorizontalAlignment="Left"   />
            <TextBox Name="ControlTB" Grid.Row="1" Margin="30,2,2,2" Width="100" Text="{Binding Text, Mode=OneWay}" />
            <TextBox Name="ControlTB2" Grid.Row="1" Margin="300,2,2,2" Width="100" DataContext="{StaticResource ModelTextContent}"
                    Text="{Binding TextStock, Mode=TwoWay}" />
        </Grid>
    </Window>

ViewModel:

    class TextContent : INotifyPropertyChanged
        {
            private Model.TextContent model;

            public TextContent()
            {
                model = new Model.TextContent();
            }

            private string _Text;

            public string Text
            {
                get { return _Text; }
                set
                {

                    _Text = value;

                    OnPropertyChanged("Text");
                    ModelUpdate(_Text);

                }
            }

            private void OnPropertyChanged(string parameter)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(parameter));
            }

            public event PropertyChangedEventHandler PropertyChanged;

            private void ModelUpdate(string textToUpdate)
            {
                model.TextStock = textToUpdate;
            }
        }

Модель:

  class TextContent
  {
      private string _TextStock;

      public string TextStock
      {
          get { return _TextStock; }
          set { _TextStock = value; }
      }

  }

1 Ответ

0 голосов
/ 05 мая 2018

См. Здесь я выполнил ваше требование.

  1. Присоединить контекст данных из кода позади.
  2. Реализация интерфейса INotifyPropertyChanged в модели.
  3. Сделать свойство TextStock как свойство с привязкой.

MainWindow.cs

 public TextContent _model { get; set; }

    public TextContentViewModel _viewModel { get; set; }
    public MainWindow()
    {
        InitializeComponent();

        _viewModel = new TextContentViewModel();
        _model = new TextContent();

        this.DataContext = _viewModel;
        ControlTB2.DataContext = _model;
    }

Ваш класс ViewModel

private TextContent model;

    public TextContentViewModel()
    {

    }

    private string _Text;

    public string Text
    {
        get { return _Text; }
        set
        {

            _Text = value;

            OnPropertyChanged("Text");
            if (model != null)
            {
                ModelUpdate(_Text);
            }
            else
            {
                model = ((Application.Current.MainWindow as MainWindow).ControlTB2).DataContext as TextContent;
            }

        }
    }

    private void OnPropertyChanged(string parameter)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(parameter));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void ModelUpdate(string textToUpdate)
    {
        model.TextStock = textToUpdate;
    }
}

Модель класса

приватная строка _TextStock;

    public string TextStock
    {
        get { return _TextStock; }
        set { _TextStock = value; OnPropertyChanged("TextStock"); }
    }

    private void OnPropertyChanged(string parameter)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(parameter));
    }

    public event PropertyChangedEventHandler PropertyChanged;

Примечание: Я переименовал имена классов согласно моему удобству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...