2016-12-08 9 views
0

У меня есть приложение WPF, который использует MVVM и код выглядит следующим образом:Wpf: Текстовый блок не обновляется после изменения

XAML:

<StackPanel Orientation="Vertical"> 
    <TextBox Text="{Binding DataFolder}" TextWrapping="Wrap"/> 
    <Button Content="Convert" Padding="8" Command="{Binding ConvertCommand}" IsEnabled="True" MinWidth="220"/> 
    <TextBlock Text="{Binding DoneMessage, UpdateSourceTrigger=PropertyChanged}"></TextBlock> 
</StackPanel> 

ViewModel:

public class ConverterViewModel : NotificationObject 
{ 
    public string DataFolder { get; set; } 
    public string DoneMessage { get; set; } 
    public DelegateCommand ConvertCommand { get; set; } 

    private readonly List<BaseConverter> _converters = new List<BaseConverter> 
    { 
     new VisualCheckEventConverter() 
    }; 

    public ConverterViewModel() 
    { 
     ConvertCommand = new DelegateCommand(VisualCheckEventConvertCommandExecute); 
     DataFolder = ConfigurationManager.AppSettings["InputFolder"]; 
     DoneMessage = "Not done yet."; 
    } 

    private void VisualCheckEventConvertCommandExecute() 
    { 
     foreach (var c in _converters) 
      c.Convert(DataFolder); 
     DoneMessage = "Done!"; 
    } 
} 

Когда я запускаю приложение, появляется сообщение «Еще не сделано». , но после выполнения команды текст текстового блока не обновляется до «Готово!».

Как заставить его работать?

+0

NotificationObject, полученный из INotifyProperyChanged. – tesicg

+0

Он может реализовать его, тем самым позволяя использовать члены и функции INotifyPropertyChanged, но вы все равно должны явно инициировать уведомление. – Yoav

ответ

0

В вашем DoneMessage10 необходимо установить notifypropertychanged, если вы хотите, чтобы представление было уведомлено.
Кроме того, AFAIK нет смысла размещать UpdateSourceTrigger=PropertyChanged на вашем TextBlock, так как он доступен только для чтения. Вы должны поместить его на свой TextBox, если вы хотите, чтобы ваш ViewModel уведомлялся при изменении текста.
Должно быть что-то вроде этого:

private string _doneMessage; 

    public string DoneMessage 
    { 
     get { return _doneMessage; } 
     set 
     { 
      _doneMessage = value; 
      //the method name may vary based on the implementation of INotifyPropertyChanged 
      NotifyPropertyChanged("DoneMessage"); 
     } 
    } 
+0

Я уже пробовал это и получил следующую ошибку: «Имя« NotifyPropertyChanged »не существует в текущем контексте». – tesicg

+0

Проверьте, как событие 'PropertyChanged' вызывается в классе' NotificationObject'. или просто отправить класс – Yoav

+0

Я использовал RaisePropertyChanged («DoneMessage»); и это работает. – tesicg

 Смежные вопросы

  • Нет связанных вопросов^_^