如何将DataTemplate数据类型绑定到接口?

时间:2013-02-22 11:43:44

标签: wpf types interface bind datatemplate

我正在编写一个松散耦合的MVVM WPF复合应用程序,父虚拟机中的子虚拟机是接口而不是类实例,例如。

public IChildViewModel { get; set; }

现在如何使用DataTemplate呈现此属性?像:

<DataTemplate DataType="{x:Type contracts:IChildViewModel}">

我理解由于接口的性质(多重继承等),WPF不允许这种直接绑定。但是由于接口应该在松散耦合的应用程序中广泛使用,是否有任何解决方法将DataTemplate绑定到接口?感谢。

4 个答案:

答案 0 :(得分:7)

您可以通过明确告诉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>

正如您所看到的,绑定明确指的是&#39; IInterface&#39; definiton。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在这种情况下,使用DataTemplateSelector似乎是一种方法。

答案 3 :(得分:0)

我在uwp中使用了数据模板中的接口类型绑定。我没有在绑定路径上显式指定接口类型。当没有显式实现接口时,它可以工作。明确实现接口后,它会静默失败。我相信,如果接口是显式实现的,则需要在绑定路径中对接口类型的显式引用,以便绑定可以正确地查找属性路径。