【问题标题】:Architecture: How to implement status which affects several UI objects?架构:如何实现影响多个 UI 对象的状态?
【发布时间】:2014-11-27 13:33:26
【问题描述】:

我只能想出以下我觉得很不满意的问题的解决方案:

我希望几个 UI 元素根据我希望能够从我的应用程序的多个位置修改的状态(0-8 之间的整数)来改变它们的行为(主要是禁用/启用或更改可见性)。

有没有比在我的状态属性的设置器中实现一个巨大的 switch/case 块更优雅的方法(实现一个策略模式似乎并不是一个更好的解决方案,因为我只是在切换“一些”标志)?也许你可以在这里用数据绑定做一些魔术?目前,我在我的视图模型中为我需要更改的所有 UI 对象属性使用了一个专用标志(这些属性又在状态属性的设置器中进行了修改......)

我想某种条件数据绑定将是我能想到的最优雅的事情,但如果有其他可行的方法来实现这一点,我想获得一些意见。

【问题讨论】:

  • 你的 UI 技术是什么? WPF、MVC、Aspnet?
  • 我正在使用带有 MVVM 的 WPF(尽管如果您的任何建议适用,我也会更改一个 winForms 项目。)
  • 使用数据绑定?如果您想要更具体的答案,请使用代码提出具体问题。

标签: c# wpf vb.net architecture switch-statement


【解决方案1】:

您可以使用旨在将您的状态 (int) 转换为控件是否启用 (bool) 的转换器。

[ValueConversion(typeof(int), typeof(bool))]
public class StatusToEnabledConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int status = (int)value;

        switch (status)
        {
            case 1: return true;
            case 2: return false;
            default: return false;
        }
    }

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

然后,您可以将要影响的所有控件的 isEnabled 绑定到您的状态代码,并使用该转换器进行转换。

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication2"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:StatusToEnabledConverter x:Key="statusConvert"/>
</Window.Resources>
<Grid>
    <Button IsEnabled="{Binding status, Converter={StaticResource statusConvert}}" />
</Grid>
</Window>

对于可见性,您可以执行完全相同的操作,使用 StatusToVisibilityConverter 并返回 Visibility.Visible 或 Visibility.Collapsed。

...或者,如果您想获得技术并重用以前的转换器,您可以设计一个 boolToVisibilityConverter 并将上面的转换器链接到这个新的转换器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多