相关疑难解决方法(0)

如何在WPF/MVVM应用程序中处理依赖项注入

我正在启动一个新的桌面应用程序,我想使用MVVM和WPF构建它.

我也打算使用TDD.

问题是我不知道如何使用IoC容器将依赖项注入我的生产代码.

假设我有以下类和接口:

public interface IStorage
{
    bool SaveFile(string content);
}

public class Storage : IStorage
{
    public bool SaveFile(string content){
        // Saves the file using StreamWriter
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个IStorage作为依赖项的类,假设这个类是一个ViewModel或一个业务类......

public class SomeViewModel
{
    private IStorage _storage;

    public SomeViewModel(IStorage storage){
        _storage = storage;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以轻松编写单元测试,以确保它们正常工作,使用模拟等.

问题是在实际应用中使用它.我知道我必须有一个链接IStorage接口默认实现的IoC容器,但我该怎么做呢?

例如,如果我有以下xaml会怎么样:

<Window 
    ... xmlns definitions ...
>
   <Window.DataContext>
        <local:SomeViewModel />
   </Window.DataContext>
</Window>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何正确地"告诉"WPF注入依赖项?

另外,假设我需要一个SomeViewModel来自我的cs代码的实例,我应该怎么做?

我觉得我完全迷失了,我会感谢任何有关如何处理它的最好方法的例子或指导.

我熟悉StructureMap,但我不是专家.此外,如果有更好/更容易/开箱即用的框架,请告诉我.

提前致谢.

c# wpf dependencies dependency-injection mvvm

90
推荐指数
6
解决办法
6万
查看次数

如何在MVVM中使用相同的ViewModel拥有多个视图?

我是WPF和MVVM的新手,在尝试DataContext在两个单独的视图中设置我的ViewModel的同一个实例时遇到了一个问题.

这是因为:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)

将为每个视图创建一个新的视图模型实例.

为了解决这个问题,我决定创建一个存储我使用的每个ViewModel的静态实例的类.然后在cs每个视图的文件中,我将从此DataContext静态类设置为适当的ViewModel.

这可行,但对于可能同时需要ViewModel的多个实例的大型程序而言似乎不是最佳选择.

有什么更好的方法来解决这个问题 - 是否有合理的方法可以使用ViewModel的同一个实例来拥有多个视图?

或者这种做法是不好的做法 - 我应该为每个ViewModel设计一个带有一个View的程序吗?

谢谢!

c# wpf mvvm

5
推荐指数
1
解决办法
3311
查看次数

将视图模型连接到视图的首选方法是什么?

在使用MVVM的过去,我已经创建了每个View作为DataTemplate其对应的viewmodel来处理连接它们.我刚开始使用MVVM Light,并注意到他们有ViewModelLocator.我看过的其他几个工具包包含了一些变化,但这会带来什么好处DataTemplate呢?

连接Views和ViewModel的最佳做法是什么?

wpf datatemplate mvvm viewmodel viewmodellocator

3
推荐指数
1
解决办法
3567
查看次数

当Bool变量变为True时更改标签

我真的不确定如何解释这个...我将把代码放在psuedo代码中以便于阅读

当一个类的bool变量发生变化时,我想要一个标签来改变它的文本...我不知道我需要使用什么因为我使用的是WPF而且这个类不能只改变标签我不能我想?

我需要某种活动吗?还是WPF活动?谢谢你的帮助

public MainWindow()
{
   SomeClass temp = new SomeClass();

   void ButtonClick(sender, EventArgs e)
   {  
      if (temp.Authenticate)
        label.Content = "AUTHENTICATED";
   }
}

public SomeClass
{
  bool _authenticated;

  public bool Authenticate()
  {
    //send UDP msg
    //wait for UDP msg for authentication
    //return true or false accordingly
  }
}
Run Code Online (Sandbox Code Playgroud)

c# wpf events delegates event-handling

3
推荐指数
1
解决办法
5149
查看次数