MVVM 中的最佳方法并不一定意味着简单。我喜欢以下方法:
a) 为每个对象的可见性创建一个布尔值,并将每个对象绑定到此(使用 bool->可见性转换器)。
此方法是为Control 设置可见性最直观、最经典的方法。
b) 绑定到枚举,每个对象都有一个唯一的转换器。
c) 绑定到枚举,使用带有参数的单个转换器。
在转换器的情况下,Enum 最好不要放在 Model 和 View 旁边。因为问题解决到了 View 这边,这很合逻辑,在这里存储数据结构。原则上,这并不重要。
例子:
public sealed class InvertableBooleanToVisibilityConverter : IValueConverter
{
enum Parameters
{
Normal,
Inverted
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var boolValue = (bool)value;
var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);
if (direction == Parameters.Inverted)
return !boolValue ? Visibility.Visible : Visibility.Collapsed;
return boolValue ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
关于其他方法的几个 cmets:
d) 使用带有布尔关键帧的可视状态管理器,并通过附加属性从 VM 驱动状态。
对于这些情况,它看起来很复杂,所以看不到它的重点。但是,如果设置可见性的条件不难,可以使用VisualStateManager。
e) 从后面的代码绑定到 VM 枚举,并通过代码设置可见性。
当您可以使用 MVVM 的典型工具(绑定、转换器等)解决问题时,这种情况下的代码隐藏是不合理的。我认为,在这种情况下,如果选择Visibility的元素不涉及业务逻辑,则不会违反MVVM原则,例如可以通过按CheckBox,ToggleButton来设置Visibility,等等