1

我正在使用 WPF,发现 MVVM 最常与 WPF 一起使用,鼓励将表示逻辑移动到 ViewModel 中并将代码隐藏保持在最低限度。

然而,一段时间后,我发现自己将更多的逻辑放在视图中,并在视图中做这些事情(XAML):

1 - 从多个元素构造字符串:

<TextBlock>
    <Run Text="{Binding Prop1}" />
    <!--<Run Combined with string.Format />-->
    <Run Text="," />
    <Run Text="{Binding Prop2}" />
</TextBlock>

2 - 将条件逻辑移动到数据触发器中:

<TextBox>
    <TextBox.Resources>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeProperty}" Value="value1">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeProperty}" Value="value2">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Resources>
</TextBox>

3 - 使用 ContentControl 结合多个数据模板来处理不同类型的内容:

<UserControl.Resources>
    <DataTemplate x:Key="Template1" >
        <ContentControl HorizontalContentAlignment="Stretch" Content="{Binding Item}">
            <ContentControl.Resources>
                <Style TargetType="ContentControl">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding HasAnyItem}" Value="True">
                            <Setter Property="ContentTemplate" Value="{DynamicResource Template2}" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding HasAnyItem}" Value="False">
                            <Setter Property="ContentTemplate" Value="{DynamicResource Template1}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Resources>
        </ContentControl>
    </DataTemplate>

    <DataTemplate x:Key="Template2" >
        ...
    </DataTemplate>
<UserControl.Resources>
...
<ContentControl ContentTemplate="{StaticResource Template1}"  Content="{Binding}"/>

这个列表还在继续,但我假设你已经大致了解我在说什么。我知道其中一些功能在某种程度上是 WPF 的美丽之处。

但是说到可维护性和灵活性,有没有更好的逻辑处理方式呢?它是否使我的 UI 变得足够聪明,这在 Windows 窗体时代是一种反模式?

4

2 回答 2

1

很好的想法,对我来说,这个想法主要是什么是可测试的以及如何为它编写测试。大多数时候,ViewModel 不是您的演示文稿(视图)的直接(一对一)对应关系。

设计师使用 XAML (Blend/Designer) 设计您的视图的想法对我来说表明没有业务逻辑,对于他们来说,业务对象定义是必要的。

当您进行单元测试时,您可以证明它是可维护的。

因此,如果您提到的所有事情都是纯粹的介绍,那么我真的不会介意。但是,如果这会影响业务数据的状态,那么我宁愿在 ViewModel 中使用它并使用转换器进行适当的演示

于 2013-07-24T09:50:58.190 回答
1

完全同意 bjoshi,基线是 XAML 上没有业务逻辑。我想再补充三点你可以考虑:

  1. 表现。当您在 XAML 上添加更多逻辑并使 UI 更强大时,也会带来性能影响的潜力。在您的示例中,从性能角度来看,不推荐使用“运行”方式。此外,您在第三个示例中使用了 DynamicResource,如果您可以找到使用 StaticResource 的方法,也可以避免这种情况。

  2. 调试。调试可能是 WPF 的缺点之一,因为 WPF 为您管理数据绑定、触发器等,而这些都是间接的。例如,您如何调试触发器?如果视图是简单而被动的,它也可能更容易调试。

  3. 灵活性。在第一个示例中,您将组织 Pro1 和 Pro2 的逻辑放在视图而不是视图模型上。假设将来您想将“,”更改为“:”,例如,您必须修改视图。这种情况很简单,但其他情况可能很困难。当然,这两种情况都不是可单元测试的。您可能需要预测变化和变化的复杂性。

希望它可以提供帮助。

于 2013-07-24T12:53:23.227 回答