【发布时间】:2015-01-12 22:55:00
【问题描述】:
我有一个包含多个子视图 (UserControl) 的视图。
<StackPanel>
<local:SubViewGPS/>
<local:SubViewText/>
</StackPanel>
此视图绑定到 ViewModel,我想根据我的 ViewModel 的布尔属性加载或不加载子视图
private bool isGPSCompatible;
public bool IsGPSCompatible {
get { return isGPSCompatible; }
set {
if (isGPSCompatible != value) {
isGPSCompatible = value;
NotifyPropertyChanged();
}
}
}
private bool isTextCompatible;
public bool IsTextCompatible {
get { return isTextCompatible; }
set {
if (isTextCompatible != value) {
isTextCompatible = value;
NotifyPropertyChanged();
}
}
}
我实际上不想“禁用”或更改“可见性”,但如果属性为假,我确实避免加载组件。根据这篇文章:Different views / data template based on member variable DataTemplate 和 DataTrigger 的组合似乎是实现目标的一种方式,但我想知道它是否存在更简单的东西。感谢您的帮助
我终于用了这个解决方案:
<UserControl x:Class="RLinkClient.LocationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:client"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<DataTemplate x:Key="GPSLocationViewTemplate">
<local:GPSControl/>
</DataTemplate>
<DataTemplate x:Key="NoGPSViewTemplate">
<TextBlock Text="GPS Disabled" TextAlignment="Center" VerticalAlignment="Center" FontStyle="Italic" Opacity="0.1" FontWeight="Bold" FontSize="14"/>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource NoGPSViewTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding GPSCapable}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource GPSLocationViewTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</Grid>
</UserControl>
但如果我可以更改 ViewModel 结构,Frank 的回答是完全可以接受的。
【问题讨论】:
-
为什么切换可见性是个问题?
-
嗨迈克,这只是优化。这个 View/ViewModel 将被实例化多次,我想限制内存和 CPU 使用率。使用的组件非常重,可见性属性只会隐藏子视图,但仍会在后台加载。