【问题标题】:Define the DataContext, but don't set it定义 DataContext,但不要设置它
【发布时间】:2016-12-07 16:27:14
【问题描述】:

我的 Visual Studio 上有 Resharper,因此在 WPF xaml 文件中设置 DataContext 对于访问 IntelliSense 非常有用。像这样的:

<UserControl ... blah blah namespace stuff >
  <UserControl.DataContext>
    <viewModels:FooViewModel />
  </UserControl.DataContext>

  <Label Text={Binding SomeText} /> <!-- I can get IntelliSense for SomeText -->
  ...

但是,在将 ViewModel/DataContext 提供给视图之前,我想对其进行一些初始化。像这样的:

public class FooViewModel : INotifyPropertyChanged {
  private Foo Model { get; set; }
  public FooViewModel(Foo model) {
    Model = model;
  }

  // Only here for WPF compatibility - I realise this might be the root of my problems :)
  public FooViewModel() 
    : this (new Foo) {
  }

  public string SomeText { ... }
  ...
}

public class ShowFooer {
  public void ShowFoo() {
    Foo model = ... // get the foo from where ever
    FooViewModel viewModel = new FooViewModel(model);
    FooWindow window = new FooWindow(viewModel); // Push the data context into the constructor

    view.Show();
    ...
  }
}

当我通过此调试时,我发现创建了 2 个 FooViewModels - 一个将上下文推送到构造函数中,另一个在 FooWindowInitialiseComponents 中自动创建。

tl;dr: 有没有办法告诉 WPF 我已经有一个数据上下文并且我只是使用数据上下文 xaml 标记来获取 IntelliSense?有没有办法阻止它创建一个新的上下文?目前,我只是在编译时注释掉数据上下文行,在编码时取消注释它们。

或替代问题: 有没有办法在构造函数之后设置数据上下文,但从第二个数据上下文初始化所有字段,而无需执行一长串 OnPropertyChanged 调用?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    是的。你可以使用这个:

    <UserControl
    xmlns:viewModels="clr-namespace:..."
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance viewModels:FooViewModel, 
    IsDesignTimeCreatable=True}" ...> ...
    

    这样您就可以自动完成所有 vm 属性。

    【讨论】:

    • 非常感谢(在我也做了这个修复之后:stackoverflow.com/questions/8303803/…
    • @Jonny:很高兴,我可以帮助你。你能把它标记为答案吗?我也添加了缺失的部分。
    • 对于自动完成的目的,IsDesignTimeCreatableTrue 还是 False 都没有关系。但这对设计视图很重要。
    【解决方案2】:

    以下 XAML 标记将导致在运行时使用默认的无参数构造函数创建视图模型的实例:

    <UserControl.DataContext>
      <viewModels:FooViewModel />
    </UserControl.DataContext>
    

    因此,如果您使用其他采用模型参数的重载以编程方式自己构建视图模型,则应该删除这段标记(可能还有默认构造函数)。

    然后,您可以按照 Schwammkopf 的建议设置 设计时间 数据上下文,以在 Visual Studio 中获得智能感知。

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2013-12-26
      • 2013-02-19
      • 1970-01-01
      • 2012-11-09
      • 2014-12-20
      相关资源
      最近更新 更多