1

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

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

我还想将值从 FolderViewModel 转移到 FolderAdminViewModel,因为主要区别在于 UI。

有没有一种简单的方法来换出 WindowManager 中的项目,或者更简单的方法来完全做到这一点?我可以有一个 ViewModel 但有两个 View 吗?有没有办法让两个模板在一个视图中并在那里选择正确的一个?

4

2 回答 2

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;
        }
    }
于 2013-04-08T15:31:53.287 回答
0

您可以使用“上下文”附加属性来指定加载的任何视图的上下文,例如:

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

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

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

阅读上下文属性:

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

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

和这里:

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

同一 ViewModel 上的多个视图部分

于 2013-04-08T16:10:37.460 回答