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

问题描述

这个版本有效

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

为什么?

标签: c#.netwpf

解决方案


您需要将类型包含在花括号中的属性中:

<UserControl x:Class="FrequentKeywordsFinder"             
         xmlns:viewModels="clr-namespace:SeoZoomReader.ViewModels"
         DataContext="{viewModels:FrequentKeywordFinderViewModel}">

而且(尽管我不知道与您的第一个版本的区别),如果您想以这种方式使用该类型,它需要派生MarkupExtension并覆盖其ProvideValue方法:

public class FrequentKeywordFinderViewModel : MarkupExtension
{
    //...

    public override object ProvideValue(IServiceProvider serviceProvider) => this;
}

推荐阅读