如何将 DataTemplate 数据类型绑定到接口?
Posted
技术标签:
【中文标题】如何将 DataTemplate 数据类型绑定到接口?【英文标题】:How to bind DataTemplate datatype to interface? 【发布时间】:2013-02-08 00:39:17 【问题描述】:我正在编写一个复合松散耦合的 MVVM WPF 应用程序,父 VM 中的子 VM 是接口而不是类实例,例如
public IChildViewModel get; set;
现在如何使用 DataTemplate 呈现此属性?喜欢:
<DataTemplate DataType="x:Type contracts:IChildViewModel">
我理解由于接口的性质(多重继承等),WPF 不允许这种直接绑定。但是由于接口应该在松散耦合的应用程序中广泛使用,是否有任何解决方法可以将 DataTemplate 绑定到接口?谢谢。
【问题讨论】:
使用ContentControl
设置它的ContentTemplate
基于DataTrigger
将DataContext 和接口传递给IValueConverter
怎么样?然后,您可以测试 Value 是否属于通过 Parameter 传入的类型,以及 True 是否使用适当的 DataTemplate
【参考方案1】:
您可以通过明确告诉 wpf 您正在绑定到接口字段来绑定到接口:
(请注意,ViewModelBase 只是一个实现 INotifyPropertyChanged 接口的基类)
public class Implementation : ViewModelBase, IInterface
private string textField;
public string TextField
get
return textField;
set
if (value == textField) return;
textField = value;
OnPropertyChanged();
public interface IInterface
string TextField get; set;
然后在 ViewModel 上:
private IInterface interfaceContent;
public IInterface InterfaceContent
get return interfaceContent;
最后是使之成为可能的 Xaml:
<ContentControl Grid.Row="1" Grid.Column="0" Content="Binding InterfaceContent">
<ContentControl.ContentTemplate>
<DataTemplate DataType="x:Type viewModels:IInterface">
<TextBox Text="Binding Path=(viewModels:IInterface.TextField)"/>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
如您所见,绑定明确引用了“IInterface”定义。
【讨论】:
这真的有效吗?我相信 XAML 类型系统不考虑接口,如下所述:badecho.com/2012/07/adding-interface-support-to-datatemplates 尽管这可能会编译。我怀疑它是否按预期工作。 确实,我刚试过:它编译但没有应用DataTemplate。 刚刚也试过了。它有效,但前提是您明确编写Path=
。 IE。 Binding (viewModels:IInterface.TextField)
不起作用。【参考方案2】:
似乎在这种情况下使用DataTemplateSelector
是一种方法。
【讨论】:
【参考方案3】:我在 uwp 中的数据模板中使用了带有接口类型的绑定。我没有在绑定路径上明确指定接口类型。当接口没有显式实现时,它可以工作。当接口被显式实现时,它会默默地失败。我相信如果接口是显式实现的,那么就需要在 Binding 路径中显式引用接口类型,这样 Binding 才能正确查找属性路径。
【讨论】:
【参考方案4】:您可以将您的接口转换为等效的抽象类。它以这种方式工作。
【讨论】:
以上是关于如何将 DataTemplate 数据类型绑定到接口?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ObservableCollection 绑定到 DataTemplate 中的文本框?
您如何访问由DataTemplate生成的数据绑定ContentControl的内容?
如何设置控件属性(在DataTemplate和UserControl中)的绑定以使用ItemSource的给定属性?
WPF 菜单事件绑定 DataTemplate下button Command事件绑定 DataTemplate遍历实体数据