此版本有效
<UserControl x:Class="FrequentKeywordsFinder"
xmlns:viewModels="clr-namespace:SeoZoomReader.ViewModels">
<UserControl.DataContext>
<viewModels:FrequentKeywordFinderViewModel />
</UserControl.DataContext>
此版本不起作用
<UserControl x:Class="FrequentKeywordsFinder"
xmlns:viewModels="clr-namespace:SeoZoomReader.ViewModels"
DataContext="viewModels:FrequentKeywordFinderViewModel">
为什么?
答案 0 :(得分:3)
您需要将类型用大括号括起来:
<UserControl x:Class="FrequentKeywordsFinder"
xmlns:viewModels="clr-namespace:SeoZoomReader.ViewModels"
DataContext="{viewModels:FrequentKeywordFinderViewModel}">
(尽管我不知道与第一个版本的区别),如果您想以这种方式使用类型,则需要从MarkupExtension
派生并覆盖其ProvideValue
方法:< / p>
public class FrequentKeywordFinderViewModel : MarkupExtension
{
//...
public override object ProvideValue(IServiceProvider serviceProvider) => this;
}
答案 1 :(得分:1)
两个版本都可以。但是他们在做不同的事情。
<UserControl.DataContext>
<viewModels:FrequentKeywordFinderViewModel />
</UserControl.DataContext>
等效于
public FrequentKeywordsFinder()
{
this.DataContext = new FrequentKeywordFinderViewModel();
}
和DataContext="viewModels:FrequentKeywordFinderViewModel"
等效于
public FrequentKeywordsFinder()
{
this.DataContext = "viewModels:FrequentKeywordFinderViewModel";
}
要注意的是,您不应该使用它们中的任何一个,因为应该假定UserControls会接收使用它们的视图(窗口)的DataContext。DataContext是用户(客户端)的数据。用户可能不同意FrequentKeywordFinderViewModel的使用,或者至少拥有自己的FrequentKeywordFinderViewModel实例