我正在重写一个WPF应用程序以使用Caliburn.Micro。该应用程序是一个菜单系统,显示文件夹,然后显示这些文件夹中的文件。问题是我需要允许用户切换到“管理”模式,这将允许其他选项。我目前每个都有一个FolderView和FileView以及ViewModels。我正在考虑使用单独的FolderAdminView和FileAdminView,以便我可以更改UI并启用其他选项。当用户改变模式时,问题是在两者之间切换。
可以同时加载FolderViewModel和FileViewModel,因此对DeactivateItem(ActiveItem, true);
的调用将作为后退按钮并返回到文件夹视图。
我还想将FolderViewModel中的值传递给FolderAdminViewModel,因为主要的区别是UI。
是否有一种简单的方法来替换WindowManager中的项目或更简单的方法来完成此操作?我可以有一个ViewModel但有两个视图吗?有没有办法在一个视图中同时使用两个模板并在那里选择正确的模板?
答案 0 :(得分:2)
您是否只能在ViewModel上拥有一个IsAdmin属性,并将仅管理员项目的可见性与使用BooleanToVisibilityConverter
的项目绑定?
视图模型
public bool IsAdmin
{
get
{
//What ever you do to work out if user is admin
//omitted any INotifyPropertyChanged gubbins
}
}
的Xaml
<StackPanel Visibility="{Binding IsAdmin,Converter={StaticResource BooleanToVisibiltyConverter}}"></StackPanel>
转换器
public sealed class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var flag = false;
if (value is bool)
{
flag = (bool)value;
}
else if (value is bool?)
{
var nullable = (bool?)value;
flag = nullable.GetValueOrDefault();
}
if (parameter != null)
{
if (bool.Parse((string)parameter))
{
flag = !flag;
}
}
return flag ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var back = ((value is Visibility) && (((Visibility)value) == Visibility.Visible));
if (parameter != null)
{
if ((bool)parameter)
{
back = !back;
}
}
return back;
}
}
答案 1 :(得分:0)
您可以使用'context'additional属性为任何加载的视图指定上下文,例如:
<ContentControl x:Name="SomeSubViewModel" cal:View.Context="SomeContext" />
CM在上下文对象上使用ToString()
来获取在视图分辨率期间用于构建typename的值。这意味着您可以为同一个视图模型提供多个视图,因此当用户处于管理模式时通过绑定View.Context
属性
您还可以为要在viewmodel上隐藏的每个项目创建绑定,并使用转换器检查用户是否已登录等 - 显然这取决于您是要在两个视图中复制XAML还是具有具有隐藏/显示区域的条件逻辑的单一视图
阅读上下文属性:
上面的链接有一些例子(在前几节中)
在这里:
http://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition
在同一ViewModel上的多个视图部分