【发布时间】:2016-08-04 23:26:07
【问题描述】:
我正在尝试为视图创建一个 DataTemplate,以根据其绑定到的对象类型显示特定的 UserControl 类型(如 texbox、组合框、自定义控件或其他视图)。
我有以下 MVVM 框架:
FieldView 绑定到FieldPresenter 的一个实例,并且应该为“标签”属性显示一个<Textblock />,并为值显示一个用户控件或另一个视图(基于值的类型),与它的 DataSource 设置为 Presenter 的 Value 属性。目前,我没有第二部分工作。我不知道如何为我需要的东西编写 WPF 模板。
视图模型:
public class FieldPresenter : Observable<object>, IFieldPresenter, INotifyPropertyChanged
{
public FieldPresenter() { }
public FieldPresenter(object value)
{
Value = value;
}
object IFieldPresenter.Value
{
get
{
return base.Value;
}
set
{
base.Value = value;
OnPropertyChanged("Value");
}
}
private string _label;
public virtual string Label
{
get
{
return _label;
}
private set
{
_label = value;
OnPropertyChanged("Label");
}
}
}
查看:
<UserControl x:Class="My.Views.FieldView"
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:ViewModels="clr-namespace:My.ViewModels"
mc:Ignorable="d"
d:DesignHeight="24" d:DesignWidth="100">
<UserControl.DataContext>
<ViewModels:FieldPresenter/>
</UserControl.DataContext>
<UserControl.Template>
<ControlTemplate>
<Grid Margin="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Key" />
</Grid.ColumnDefinitions>
<StackPanel Margin="0,0,0,0" HorizontalAlignment="Stretch" Width="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=ActualWidth}">
<TextBlock Text="{Binding Label}" FontWeight="Bold" Height="32" HorizontalAlignment="Stretch"/>
<TextBox Text="{Binding Value}" Height="Auto" HorizontalAlignment="Stretch"/>
</StackPanel>
</Grid>
</ControlTemplate>
</UserControl.Template>
</UserControl>
我很好奇我正在尝试做的事情是否可能,或者我是否可以通过让我的 Presenter 视图模型返回一个 UserControl 而不是一个对象值来解决它,并让 Presenter 从对象中解析 UserControl 类型类型,但我不觉得我的 Presenter 应该实例化控件(或者从技术上讲是一个未绑定的视图)。我应该做一个接口,比如IViewAs<controlType> { controlType View { get; } }吗?
我如何根据数据绑定对象的类型将上述脚本中的 <TextBox Text="{Binding Value}" /> 替换为某种 UserControl 模板?
【问题讨论】:
标签: c# wpf xaml data-binding datatemplate