【发布时间】:2018-05-07 15:44:36
【问题描述】:
型号:
TabModel.cs
DisplayTabViewModel.cs - 包含少数 TabModel 覆盖的属性,例如名称、标题等。
视图模型:
- MainViewModel.cs
观看次数:
MainWindow.xaml - 窗口
DisplayTabView.xaml - 用户控件
这是纯 MVVM 模式,没有代码隐藏。 TabModel 在 Word 文档关闭后调用 EventHandler - RefreshRequested。 MainViewModel 包含订阅者。 MainViewModel 中的方法 Refresh() 工作正常。该方法在我关闭文档后触发。现在我想从 MainViewModel 刷新 DisplayTabView.xaml 中的 WebBrowser。我已经为此苦苦挣扎了太多小时。你能否指出我正确的方向。谢谢。
TabModel.cs
public abstract class TabModel : ITabModel, INotifyPropertyChanged
{
public async void HiddenFileExists()
{
(...)
OnRefreshRequested();
}
public delegate void RefreshRequestedEventHandler(object source, EventArgs args);
public event RefreshRequestedEventHandler RefreshRequested;
public virtual void OnRefreshRequested()
{
RefreshRequested?.Invoke(this, EventArgs.Empty);
}
}
MainViewModel.cs
public class MainViewModel : INotifyPropertyChanged
{
private readonly ObservableCollection<ITabModel> tabs;
private void DisplayFileTab(object parameter)
{
(...)
tabs.ElementAt(TabIndex).RefreshRequested += Refresh;
}
public void Refresh(object source, EventArgs args)
{
MessageBox.Show("Refresh");
}
DisplayTabView.xaml
<Grid>
<WebBrowser h:WebBrowserExtensions.BindableSource="{Binding FileUrl}" Tag="{Binding AcceptedKeywordsArray}" h:WebBrowserExtensions.BindableLoaded="{Binding}" />
</Grid>
MainWindow.xaml
<Grid>
<DockPanel>
<TabControl Name="tabControl" ItemsSource="{Binding Tabs}" SelectedIndex="{Binding TabIndex}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type m:DisplayTabViewModel}">
<v:DisplayTabView x:Name="DisplayTab"/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate DataType="{x:Type m:ITabModel}">
<Grid>
(...)
</Grid>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
</DockPanel>
</Grid>
【问题讨论】:
-
MVVM != 没有代码隐藏。您的 UI 逻辑在代码隐藏中很好。从视图模型访问 UI 元素!= MVVM。
-
建议:不要使用 ViewModel 在 UI 上假设或执行操作。假设您不知道 UI 对您提供的信息做了什么。在 UI 上,为了防止代码落后(我喜欢!),您只需要倾听您的数据并从中工作。强制从 ViewModel 刷新是不好的,从 Model 更糟。那不是 MVVM 并且远离纯 MVVM。如果不完全了解用例,我认为您不会得到您正在寻找的正确答案。如果您逐步说明您要实现的功能,我可以提供帮助。