gpt4 book ai didi

c# - Caliburn Micro,如何首先使用 ViewModel 使用 ContentControl(或显示 'sub' ViewModel)

转载 作者:太空狗 更新时间:2023-10-29 23:20:59 33 4
gpt4 key购买 nike

我在整个应用程序中首先使用 ViewModel(或者我认为是这样)使用 MVVM 框架 Caliburn Micro。但是,当我在使用 TryClose(true) 的对话框出现问题时无法关闭它的父窗口并偶然发现这个问题完美地概述了我的问题,我也得到了“TryClose requires a parent IConductor或具有 Close 方法或 IsOpen 属性的 View 。”:

Caliburn.Micro - ShowDialog() how to close the dialog?

但是,我不确定如何实现该解决方案。答案是:

Remove the cal:Bind.Model and cal:View.Model bindings...

事实证明,使用这些绑定(bind)是一种 View 优先的方法,而我并没有意识到自己在这样做。这是我的违规对话的示例:

<UserControl ... Height="206" Width="415">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="AUTO" />
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button x:Name="Okay" Content="Okay" Width="100" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Button x:Name="Cancel" Content="Cancel" Width="100" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
<ContentControl cal:View.Model="{Binding TimeSpanViewModel}"/>
</Grid>
</UserControl>

它只是一个包装器,带有用于现有 ViewModel 的确定和取消按钮(谁的 View 由 caliburn 解析,因此我认为我先做 ViewModel)。如果我删除此 cal:View.Model 绑定(bind),我确实重新获得了关闭对话框的能力,但我丢失了所有实际内容。我正在使用 ContentControl 在我的整个应用程序中显示内容(在 ItemsControls、对话框、弹出窗口等中)。

我的问题是,我应该如何在 ViewModel first Caliburn 中显示 ViewModel?

编辑:我正在使用 WindowManager 显示 DialogViewModel(它继承了屏幕):

[Export(typeof(IWindowManager))]
public class AppWindowManager : MetroWindowManager, IDialogManager
{
AppViewModel Content { get; set; }

public AppWindowManager()
{

}

public override MetroWindow CreateCustomWindow(object view, bool windowIsView)
{
if (windowIsView)
{
return view as MainWindowContainer;
}

MainWindowContainer window = new MainWindowContainer();
//{
window.Content = view;
//};

return window;
}

public override bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null)
{
Window window = CreateWindow(rootModel, true, context, settings);

return window.ShowDialog();
}

public object ShowCustomDialog(object rootModel, string title, bool showWindowsOptions = true)
{
dynamic settings = new ExpandoObject();
settings.Title = title;
settings.ShowCloseButton = showWindowsOptions;
settings.ShowMaxRestoreButton = showWindowsOptions;
settings.ShowMinButton = showWindowsOptions;
settings.SizeToContent = SizeToContent.WidthAndHeight;
return ShowDialog(rootModel, null, settings);
}

public ILoadingDialogViewModel CreateLoadingDialogManager()
{
return new LoadingDialogViewModel(this);
}
}

最佳答案

回答主要问题

how should I be displaying a ViewModel in a ViewModel first Caliburn?

我假设 TimeSpanViewModel 是您在 ViewModel 上拥有的一个属性,它有一个 [Import](并且 ViewModel 正在导出自身)?我认为您应该将 cal:View.Model="{Binding TimeSpanViewModel}" 更改为 x:Name="TimeSpanViewModel"。即使这可能无法解决问题,这也是正确的做法,Caliburn 将确保其正确绑定(bind)。

我试图重现您的问题,但即使使用您的方式它对我也有效。那么为什么它不能按照您当前的方式工作,这是一个很好的(第二个)问题。

最大的问题可能是您的 AppWindowManager,如果您在其中创建的窗口没有通过正确的 Caliburn 代码,它将无法正确绑定(bind)。由于缺少很多代码,我什至不确定 AppViewModel Content { get;放; 在那里做,大部分我只能推测。您是否尝试使用默认的 WindowManager 实现,只是为了看看它是否适用?

关于c# - Caliburn Micro,如何首先使用 ViewModel 使用 ContentControl(或显示 'sub' ViewModel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37563419/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com