【发布时间】:2013-12-25 21:28:50
【问题描述】:
我正在使用 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 窗体时代是一种反模式?
【问题讨论】:
标签: wpf xaml mvvm anti-patterns