#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"
};
}