在 Catel 中分离 MVVM 视图
Detach MVVM View in Catel
我有一个Catel.Window作为带有菜单的MainWindow,主要内容是:
<ContentControl Content="{Binding ActualVM, Converter={catel:ViewModelToViewConverter}}" />
在 MainWindowViewModel 中:
public ViewModelBase ActualVM { get; set; }
MainWindowViewModel 在菜单命令的 OnExecute 方法中设置 ActualVM。它工作正常。我希望能够将实际视图分离到新的 window。在一个视图的代码后面,我将以下内容用于单击按钮:
protected void DetachClick(object obj, RoutedEventArgs e)
{
ContentPresenter vp = this.GetVisualParent() as ContentPresenter;
if (vp != null)
{
vp.Content = null;
var dw = new DetachWindow();
dw.Content = this;
dw.Show();
}
}
DetachWindow 是一个带有 "empty" ViewModel 的 "empty" Catel.Window。
它也工作正常,视图和视图模型在分离 window 中运行,但如果我单击 MainWindows 的菜单项之一,MainWindowViewModel 设置 ActualVM,但 MainWindows 不会像之前那样显示视图分离。
这是因为您在使用此代码时取消了绑定:
vp.Content = null;
您应该将 VM 上的值设置为 null,以便正确更新绑定,而不是用新值替换绑定。
您可以尝试的另一个选择是使用 SetCurrentValue
而不是 .Content = null
。
我有一个Catel.Window作为带有菜单的MainWindow,主要内容是:
<ContentControl Content="{Binding ActualVM, Converter={catel:ViewModelToViewConverter}}" />
在 MainWindowViewModel 中:
public ViewModelBase ActualVM { get; set; }
MainWindowViewModel 在菜单命令的 OnExecute 方法中设置 ActualVM。它工作正常。我希望能够将实际视图分离到新的 window。在一个视图的代码后面,我将以下内容用于单击按钮:
protected void DetachClick(object obj, RoutedEventArgs e)
{
ContentPresenter vp = this.GetVisualParent() as ContentPresenter;
if (vp != null)
{
vp.Content = null;
var dw = new DetachWindow();
dw.Content = this;
dw.Show();
}
}
DetachWindow 是一个带有 "empty" ViewModel 的 "empty" Catel.Window。 它也工作正常,视图和视图模型在分离 window 中运行,但如果我单击 MainWindows 的菜单项之一,MainWindowViewModel 设置 ActualVM,但 MainWindows 不会像之前那样显示视图分离。
这是因为您在使用此代码时取消了绑定:
vp.Content = null;
您应该将 VM 上的值设置为 null,以便正确更新绑定,而不是用新值替换绑定。
您可以尝试的另一个选择是使用 SetCurrentValue
而不是 .Content = null
。