31

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

public IChildViewModel { get; set; }

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

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

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

4

4 回答 4

6

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

于 2014-09-03T11:19:05.843 回答
2

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

于 2019-11-12T15:46:27.497 回答
1

我在 uwp 中的数据模板中使用了带有接口类型的绑定。我没有在绑定路径上明确指定接口类型。当接口没有显式实现时,它可以工作。当接口被显式实现时,它会默默地失败。我相信如果接口是显式实现的,那么就需要在 Binding 路径中​​显式引用接口类型,这样 Binding 才能正确查找属性路径。

于 2020-01-28T13:02:50.793 回答
0

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

于 2019-08-23T12:09:18.343 回答