如何将 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 中的文本框?

WPF DataTemplate 绑定取决于属性的类型

您如何访问由DataTemplate生成的数据绑定ContentControl的内容?

如何设置控件属性(在DataTemplate和UserControl中)的绑定以使用ItemSource的给定属性?

WPF 菜单事件绑定 DataTemplate下button Command事件绑定 DataTemplate遍历实体数据

如何在 DataTemplate 中绑定两个不同的类属性