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