MVVM 中的最佳方法并不一定意味着easy。我喜欢以下方法:
a) 为每个对象的可见性创建一个布尔值,并将每个对象绑定到该布尔值(使用 bool->visibility 转换器)。
此方法是设置 Visibility 的最直观、最经典的方法Control
.
b) 绑定到枚举,每个对象都有一个唯一的转换器。
c) 使用带有参数的单个转换器绑定到枚举。
对于转换器来说,Enum
最好不要在Model
并在旁边View
。因为问题解决到了视图一侧,这是非常合乎逻辑的,在这里存储数据结构。原则上,这并不重要。
Example:
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;
}
}
关于其他方法的一些评论:
d) 使用具有布尔关键帧的视觉状态管理器,并通过附加属性从 VM 驱动状态。
对于这些情况,看起来很复杂,所以看不到其中的意义。但是,如果设置Visibility的条件并不困难,你可以使用VisualStateManager
.
e) 从代码隐藏绑定到 VM 枚举,并通过代码设置可见性。
当您可以使用 MVVM 的典型工具(绑定、转换器等)解决问题时,这种情况下的代码隐藏是不合理的。我认为,在这种情况下,如果选择元素到Visibility
不涉及业务逻辑,比如可以通过按来设置可见性CheckBox
, ToggleButton
, etc.