具有运行模式和编辑模式

时间:2018-09-28 13:13:21

标签: c# wpf visual-studio

我对以不同的“模式”运行同一应用程序有疑问。 基本上,如果您知道自己在做什么(例如,您是各种各样的管理员),我希望该应用程序是可编辑的,但如果您只是使用它,则不希望该应用程序是可编辑的。 我正在考虑制作一个bool / int值,并使其根据模式隐藏show元素。但这是正确的方法吗?有一个更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您正确地在ViewModel中具有反映逻辑要求的单个设置。如果只有两个选项,则应为布尔值。

您可能必须仔细考虑哪些控件需要被禁用,隐藏或只读。例如,不应禁用带有滚动条的控件,否则用户将无法滚动。文本框可以是两种格式(只读允许用户选择和复制,禁用则不允许)。如果用户有某种方式可以启用其他控件,则可以将其禁用(例如,只有在保存更改后才启用的保存按钮),或者如果用户仅具有只读视图,则可以隐藏其他控件。

您很可能需要几个ValueConverters才能将布尔值“ IsAdmin”(或其他)标志转换为WPF期望的值。例如,您可以直接绑定IsEnabled,但是IsReadOnly将成为将其反转的转换器。如果要隐藏某些东西,则需要这样的转换器:

public class BoolVisiblityInverseConverter: IValueConverter
{
    /// <inheritdoc />
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value.GetType() != typeof(bool))
        {
            throw new ArgumentException("BoolVisiblityInverseConverter can only accept a bool");
        }

        var val = (bool)value;
        return val ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后,您需要在XAML的“资源”部分中对其进行定义

<converters:BoolVisiblityInverseConverter x:Key="BoolVisiblityInverseConverter" />

并将其绑定到Visibility属性

<Button Visibility="{Binding IsAdmin, Converter={StaticResource BoolVisiblityInverseConverter}}" />

此方法的目标是使View和ViewModel之间的接口尽可能简单。 VM可以决定使用哪种模式,并且View会在合适的状态下显示每个控件。

答案 1 :(得分:0)

enter image description here

您可以使用Visibility Converter轻松完成此操作。将可编辑控件和只读控件放​​在同一位置。

Xaml:

<Window.Resources>
        <myapp:BoolToVisible x:Key="bool2visible"/>
    </Window.Resources>
    <Grid Margin="10">
        <StackPanel>
        <CheckBox IsChecked="{Binding Mode}">Mode on</CheckBox>

            <StackPanel Margin="10">
            <TextBlock Text="{Binding Number}" Visibility="{Binding Mode, Converter={StaticResource bool2visible}, ConverterParameter=1}"/>
            <TextBox Text="{Binding Number}" Visibility="{Binding Mode, Converter={StaticResource bool2visible}}"/>
        </StackPanel>
        </StackPanel>
    </Grid>

布尔型到可见性转换器

public class BoolToVisible:IValueConverter
{

public BoolToVisible()
{

}

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var val=(bool)value;
    if (parameter?.ToString() == "1")
    {
        val=!val;
    }
    if (val)
    {
        return Visibility.Visible;
    }else
        return Visibility.Collapsed;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    throw new NotImplementedException();
}

}