WPF:从XAML设置ViewModel,为什么第二个解决方案不起作用?

时间:2019-12-14 18:52:50

标签: c# .net wpf

此版本有效

<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">

为什么?

2 个答案:

答案 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实例