【发布时间】:2019-10-04 03:49:02
【问题描述】:
简介
我正在尝试使用 Structuremap IoC 容器将我的 C# WPF 应用程序覆盖到 MVVM 模式中进行依赖注入。
在我尝试在 UserControls 中使用与 Windows 相同的命令绑定之前,我的代码运行良好。
我尝试了以下
如果我尝试在某个 UserControl 中绑定命令,则会收到以下错误:System.Windows.Data Error: 40 : BindingExpression path error: 'HelloWorldCommand' property not found on 'object' ''MainWindowViewModel' (HashCode=7304143)'. BindingExpression:Path=HelloWorldCommand; DataItem='MainWindowViewModel' (HashCode=7304143); target element is 'Button' (Name=''); target property is 'Command' (type 'ICommand')
所以问题是我的HelloWorldCommand 是在我的CustomUserControlViewModel 中,它包含并由MainWindowViewModel 绑定。
我的自定义代码 sn-p
我的代码与以下教程 90% 相同: Part 1 Part 2
只有ObjectFactory方法不同,如下图:
public sealed class ObjectFactory
{
public static IContainer Container { get; private set; }
private static Action<ConfigurationExpression> _initialiseMethod;
private static readonly Lazy<IContainer> _containerBuilder =
new Lazy<IContainer>(CreateContainer, LazyThreadSafetyMode.ExecutionAndPublication);
public static void Initialise()
{
Container = _containerBuilder.Value;
}
private static IContainer CreateContainer()
{
return new Container(config =>
{
#region services
config.For<IFileDisplayerService>().Singleton().Use<FileDisplayerService>();
config.For<IWatermarkService>().Singleton().Use<WatermarkService>();
#endregion
#region windows
config.For<IWindow>().Use<MainWindow>();
config.For<IWatermarkWindow>().Use<WatermarkSettingsWindow>();
config.For<IMainWindow>().Singleton().Use<MainWindow>();
config.For<IMainWindowViewModel>().Singleton().Use<MainWindowViewModel>();
config.For<IWatermarkSettingsWindow>().Singleton().Use<WatermarkSettingsWindow>();
config.For<IWatermarkSettingsWindowViewModel>().Singleton().Use<WatermarkSettingsWindowViewModel>();
#endregion
#region views
config.For<IFileListView>().Use<FileListView>();
config.For<IFileListViewModel>().Use<FileListViewModel>()
.Ctor<IView>().Is<FileListView>();
config.For<IFileDisplayerView>().Use<FileDisplayerView>();
config.For<IFileDisplayerViewModel>().Use<FileDisplayerViewModel>()
.Ctor<IView>().Is<FileDisplayerView>();
#endregion
});
}
}
我的问题
我的具体问题是,如何将命令绑定到具有自己和父 ViewModel 的用户控件?这在上面的示例中没有显示。
我认为父 ViewModel 也应该包含命令,但我不知道如何将它从子 ViewModel 传递给父 ViewModel。
【问题讨论】:
-
“我的代码与以下教程 90% 相同” 表示您的代码不同。请在您的问题中分享您代码的相关部分。 “我认为父 ViewModel 也应该包含命令,但我不知道如何将它从子 ViewModel 传递给父 ViewModel”——我怀疑这是个好主意,但是如果需要,父视图模型可以从它自己的孩子那里获取它想要的任何属性——除非你用一些拜占庭的 IOC 东西隐藏它自己的孩子,在这种情况下,你已经学会了一个不使用这些的新理由。
-
因为错误表明您的
MainWindowViewModel上没有名为HelloWorldCommand的属性。鉴于您的UserControl的DataContext似乎指向MainWindowViewModel,该属性应该仅在那里定义。 -
@Bijington 明白了。 “... MainWindowViewModel 属性应该只在那里定义。”。因此,目标是正确地将零件彼此分开。这意味着我想在 UserControl 的 ViewModel 中而不是在父窗口的 ViewModel 中实现 UserControl 的按钮。我的下一个想法是以某种方式以编程方式将孩子的 dataContext 与父母的 dataContext 合并。可行吗?明天我会将我的整个代码上传到一个说明性的 git 存储库,但现在不幸的是,这就是我所拥有的。
-
CustomUserControlViewModel是MainWindowViewModel的属性吗?然后你可以绑定到这样的属性:{Binding CustomUserControlViewModel.HelloWorldCommand}。但是你应该发布你的类的定义并澄清命令的 DataContect 是什么。
标签: wpf mvvm data-binding ioc-container structuremap