Silverlight 4已经淘汰,似乎我们再次错过了此版本中的DataTemplate DataType功能,这对MVVM支持恕我直言非常关键。对于我的WPF应用程序,此时,我已经非常习惯将我的Views的DataTemplates全局添加到我的Application.Resources,其数据类型为我对应的ViewModel:
即
<DataTemplate DataType="{x:Type viewModels:myViewModel}">
<views:myView/>
</DataTemplate>
我喜欢这种方法,因为我所有绑定的ViewModel都会自动显示正确的内容...当我在视图中将一些ItemSource绑定到ViewModels集合时尤其有用...例如,这将自动确保每个TabControl中与Collection<SomeViewModel>
绑定的标签会显示与SomeViewModel
相关联的视图。
我为SL 3尝试过的一些事情包括:
创建“DataTemplatePresenterContentControl”,在控件加载后自动为内容应用DataTemplate
使用TypeConverter,动态应用于控制负载,沿着可视树向下查找数据绑定对象
使用动态应用于控件加载的样式,沿着可视树向下查找数据绑定对象
然而,这些方法都没有真正以可接受的方式解决我上面提到的情况,这非常关键。
因此,由于Silverlight 4中仍然无法开箱即用,所以我很高兴知道是否有人提出了一些合理的选择。
感谢。
答案 0 :(得分:8)
我在几个商业项目中的表现方式如下:
我有一个标准的IValueConverter
public class ViewTemplateChooser : IValueConverter
{
/// <summary>
/// Modifies the source data before passing it to the target for display in the UI.
/// </summary>
/// <returns>
/// The value to be passed to the target dependency property.
/// </returns>
/// <param name="value">The source data being passed to the target.</param><param name="targetType">The <see cref="T:System.Type"/> of data expected by the target dependency property.</param><param name="parameter">An optional parameter to be used in the converter logic.</param><param name="culture">The culture of the conversion.</param>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is MyViewModel)
{
return new MyView { DataContext = value };
}
return value;
}
/// <summary>
/// Modifies the target data before passing it to the source object. This method is called only in <see cref="F:System.Windows.Data.BindingMode.TwoWay"/> bindings.
/// </summary>
/// <returns>
/// The value to be passed to the source object.
/// </returns>
/// <param name="value">The target data being passed to the source.</param><param name="targetType">The <see cref="T:System.Type"/> of data expected by the source object.</param><param name="parameter">An optional parameter to be used in the converter logic.</param><param name="culture">The culture of the conversion.</param>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
转换器需要命名空间注册
xmlns:Converters="clr-namespace:YourProject.Converters"
然后在资源部分引用转换器:
<UserControl.Resources>
<Converters:ViewTemplateChooser x:Key="TemplateChooser" />
</UserControl.Resources>
最后我使用转换器将ViewModel转换为View,并将视图的Datacontext设置为ViewModel
<ContentControl Content="{Binding Workspace, Converter={StaticResource TemplateChooser}}" Margin="5,35,5,5" Grid.Column="1" />
可以修改转换器以实现导航策略,我试图使示例尽可能简单。
我希望这有帮助,你不必走极端 - 或第三方图书馆 - 来获得你想要的东西。
答案 1 :(得分:1)
在WPF和Silverlight中,我使用Prism来做到这一点。我发现根据类型切换视图会更加通用。它需要一点点才能被束缚,但一旦它进入,可能性是无穷无尽的。
<强> 修改 强>
我是通过将RegionName绑定到我的ViewModel中的属性来实现的(可能是GetType()。如果需要,可以使用名称)。然后,我注册名称的类型,它只是工作。
对于类似ListBox的情况,我将数据模板设置为:
<ContentControl Regions:RegionManager.RegionName="{Binding SomeName}" />
如果您不希望SomeName
位于要绑定的对象上,请考虑返回类型名称的ValueConverter:
<ContentControl Regions:RegionManager.RegionName="{Binding SomeName, Converter={StaticResource ObjectToTypeConverter}}" />
这有帮助吗?