在caliburn.micro中启用管理模式视图

本文关键字:管理模式 视图 启用 caliburn micro | 更新日期: 2023-09-27 18:08:09

我正在重写一个WPF应用程序来使用Caliburn.Micro。这款应用是一个菜单系统,可以显示文件夹,然后显示文件夹中的文件。问题是,我需要允许用户切换到"管理"模式,这将允许额外的选项。我目前有一个FolderView和FileView以及每个ViewModels。我想有一个单独的FolderAdminView和FileAdminView,这样我就可以改变UI并启用额外的选项。当用户改变模式时,问题是在两者之间切换。

FolderViewModel和FileViewModel可以同时加载,因此调用DeactivateItem(ActiveItem, true);将充当返回按钮并返回到文件夹视图。

我也想从FolderViewModel延续到FolderAdminViewModel的值,因为主要的区别是UI。

是否有一个简单的方法来交换项目在WindowManager或更简单的方法来做这件事?我可以有一个ViewModel,但两个视图?是否有一种方法,有两个模板在一个视图,并选择正确的一个吗?

在caliburn.micro中启用管理模式视图

你能不能在你的ViewModel上有一个IsAdmin属性,并使用BooleanToVisibilityConverter绑定你的admin项目的可见性?

视图模型

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;
        }
    }

你可以使用'context'附加属性来指定所加载视图的上下文,例如:

<ContentControl x:Name="SomeSubViewModel" cal:View.Context="SomeContext" />

CM在上下文对象上使用ToString()来获得一个值,它将在视图解析期间用于构建typename。这意味着您可以为同一个视图模型拥有多个视图,因此当用户处于管理模式时,可以通过绑定View.Context属性

添加额外的功能

你也可以为你想隐藏在视图模型上的每个项目创建绑定,并使用转换器来检查用户是否登录等——显然,这取决于你是想在两个视图中复制XAML,还是想在一个视图中使用条件逻辑来隐藏/显示区域

阅读上下文属性:

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions& referringTitle =文档

上面的链接有一些例子(在前几节)

:

http://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition

相同ViewModel部分的多个视图