Модель привязки из представления wpf c#

#c# #wpf #model #viewmodel #model-binding

#c# #wpf #Модель #viewmodel #модель-привязка

Вопрос:

Я пытаюсь создать DTO для хранения конфигурации программного обеспечения, но я застрял, потому что мое представление не отправляет данные в мою ViewModel, а также в мой DTO. Мне нужно перенести 2 текстовых поля и 3 выпадающих списка в мой DTO, но при использовании этого кода значения всегда пусты.

Моя ViewModel:

 public class ViewModelProcessamentoArquivo : ViewModelBase
{
private PesquisaConfiguracao pesquisaConfiguracao;

public PesquisaConfiguracao PesquisaConfiguracao
        {
            get { return pesquisaConfiguracao; }
            set
            {
                pesquisaConfiguracao = value;

                base.OnPropertyChanged("PesquisaConfiguracao");
            }
        }
}
  

Мой DTO / Model

 public class PesquisaConfiguracao
    {
        public string ArquivoOrigem { get; set; }
        public string ArquivoDestino { get; set; }
        public string TipoPesquisa { get; set; }
        public string PesquisaVeicular { get; set; }
        public string PesquisaCrediticia { get; set; }
    }
  

И мой взгляд такой.

 <TextBox Name="txtBuscarArquivoOrigem" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Height="30" Margin="10, 0" Text="{Binding PesquisaConfiguracao.ArquivoOrigem}" />

<TextBox  x:Name="txtBuscarArquivoDestino" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" Height="30" Margin="10, 0" Text="{Binding PesquisaConfiguracao.ArquivoDestino}" IsEnabled="false" />

...
  

Ребята, вы знаете, почему это происходит? Я использовал нечто подобное в своем другом проекте и работал просто отлично. Также, если у вас есть какой-либо другой возможный способ исправить эту проблему, пожалуйста, прокомментируйте!

Комментарии:

1. Была PesquisaConfiguracao когда-либо инициализирована?

2. Я думаю, вам нужно реализовать INotifyPropertyChanged на PesquisaConfiguracao

3. @EdPlunkett согласен.. Может быть pesquisaConfiguracao = новый PesquisaConfiguracao().

4. Он инициализируется в конструкторе «ViewModel».

Ответ №1:

Сначала изменяется свойство UpdateSourceTrigger, таким образом, цель (представление) будет обновлять ваш исходный объект при каждом изменении:

    <TextBox Name="txtBuscarArquivoOrigem"  Height="30" Text="{Binding PesquisaConfiguracao.ArquivoOrigem, UpdateSourceTrigger=PropertyChanged}" />
  

Затем реализуйте в своем исходном объекте интерфейс INotifyPropertyChange для его свойств, чтобы обновлять представление при изменении значения:

   private string _arquivoOrigem;

    public string ArquivoOrigem
    {
        get
        {
            return _arquivoOrigem;
        }
        set
        {
            _arquivoOrigem = value;
            OnPropertyChanged("ArquivoOrigem");
        }
    }
  

Поместите точку останова в параметр установки свойств, и она будет прервана при изменении значения в текстовом поле представления.

Если это не работает, вы, вероятно, забыли установить DataContext для вашего ViewModel:

 <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" 
    DataContext="{StaticResource MainViewModel}">
  

Или не инициализировал ваш исходный объект:

     public MainViewModel()
    {
        pesquisaConfiguracao = new PesquisaConfiguracao
        {
            ArquivoDestino = "aaa",
            ArquivoOrigem = "bbb",
            PesquisaCrediticia = "ccc",
            PesquisaVeicular = "dddd",
            TipoPesquisa = "eee"
        };
    }