【问题标题】:How to bind DataTemplate datatype to interface?如何将 DataTemplate 数据类型绑定到接口?
【发布时间】: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

标签: wpf types interface bind 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】:

      您可以将您的接口转换为等效的抽象类。它以这种方式工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 2017-01-29
        • 2017-05-16
        相关资源
        最近更新 更多