У меня есть в моем Page1.xaml.cs (код программной части) событие, которое должно изменить все свойства в моей ViewModel.
Вот пример: (Page1.xaml.cs)
public Page1()
{
InitializeComponent();
example.Event += example_Event;
}
private void example_Event(...)
{
// here I want to change all Properties in my ViewModel
}
Как я могу этого добиться?
РЕДАКТИРОВАТЬ
У меня есть WebBrowser-Control, который отображает .ppt. Я хочу обновить все свои свойства в моей ViewModel, когда это событие запускается:
xaml.cs:
private void powerPointBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
{
//...
oPPApplication.SlideShowNextSlide += ppApp_SlideShowNextSlide; //Event that gets triggered when i change the Slide in my WebBrowser-Control
}
private void ppApp_SlideShowNextSlide(PPt.SlideShowWindow Wn)
{
// here i dont know how to get access to my Properties in my VM (i want to call OnChangedProperty(//for all properties in my VM))
}
да, я знаю, что мне нужно сделать это с помощью string.empty ^^, но я не знаю, как запустить OnPropertyChanged в моем коде позади, чтобы получить свойства в моей виртуальной машине.
Мы также этого не знаем, поскольку вы не показали нам соответствующие части своей модели представления. Я бы сказал, добавьте к модели представления общедоступный метод, который вызывает OnPropertyChanged.
Как насчет того, чтобы просто поднять измененный текст? msdn.microsoft.com/en-us/library/…
Мне кажется, что это XY проблема. Чего вы хотите достичь фактически?
Не знаю, как лучше объяснить ... Я отредактировал свой вопрос (теперь на реальном примере). Чтобы упростить свой вопрос: я просто хочу обновить все свои свойства в моей виртуальной машине из моего кода позади (xaml.cs) при запуске события.
Обычно View (включая исходный код) не несет ответственности за уведомление об обновлении свойств ViewModel, должно быть наоборот. Но я вижу, что в вашем случае вы хотели бы сделать определенную вещь (в данном случае получить последнее значение каждого свойства) при обработке какого-либо события, поэтому вот вам несколько решений для того, что вам нужно.
В вашей виртуальной машине определите метод, который активирует PropertyChanged для всех свойств:
public void UpdateAllProperties()
{
// Call OnPropertyChanged to all of your properties
OnPropertyChanged(); // etc.
}
Затем в коде вашего представления вам нужно просто вызвать этот метод:
// every View has a ViewModel that is bound to be View's DataContext. So cast it, and call the public method we defined earlier.
((MyViewModel)DataContext).UpdateAllProperties();
К сожалению, этот подход не очень элегантен для стиля MVVM. Я бы посоветовал вам сделать этот метод / обработчик событий как Bindable ICommand
. Таким образом, вам не нужно писать какой-либо код, например: в вашей виртуальной машине определите ICommand
.
public ICommand UpdateAllPropertiesCommand {get; private set;}
= new Prism.Commands.DelegateCommand(UpdateAllProperties);
// You can switch the UpdateAllProperties method to private instead.
// Then remove any code behinds you had.
Затем в вашем представлении (xaml) вы можете привязать ICommand
к определенному триггеру события элемента управления.
xmlns:i = "http://schemas.microsoft.com/expression/2010/interactivity"
<!--In one of the controls-->
<i:Interaction.Triggers>
<i:EventTrigger EventName = "Loaded">
<i:InvokeCommandAction Command = "{Binding UpdateAllPropertiesCommand , Mode=OneTime}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Здесь команда будет автоматически вызываться при обработке загруженного события.
Запустите событие PropertyChanged модели представления с пустым или пустым именем свойства.