我正在编写一个松散耦合的MVVM WPF复合应用程序,父虚拟机中的子虚拟机是接口而不是类实例,例如。
public IChildViewModel { get; set; }
现在如何使用DataTemplate呈现此属性?像:
<DataTemplate DataType="{x:Type contracts:IChildViewModel}">
我理解由于接口的性质(多重继承等),WPF不允许这种直接绑定。但是由于接口应该在松散耦合的应用程序中广泛使用,是否有任何解决方法将DataTemplate绑定到接口?感谢。
答案 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中使用了数据模板中的接口类型绑定。我没有在绑定路径上显式指定接口类型。当没有显式实现接口时,它可以工作。明确实现接口后,它会静默失败。我相信,如果接口是显式实现的,则需要在绑定路径中对接口类型的显式引用,以便绑定可以正确地查找属性路径。