c# - WPF - 如何使用 XAML 中的参数将 ViewModel 绑定(bind)到 View

标签 c# wpf xaml mvvm

这个问题在这里已经有了答案:





MVVM Understanding Issues

(5 个回答)


6年前关闭。




我最近一直在审查 Josh Smith 的代码(来自他著名的 MVVM 文章),并且我一直在尝试创建一个遵循他理想的 MVVM 模式的程序。

现在问题来了,在 Josh Smith 的项目的 MainWindowResources 中,他将 View 绑定(bind)到(此处仅使用任意名称)ExampleViewModel,因此 TabControl(工作区)显示 ExampleView 而不仅仅是 ExampleViewModel 的 .ToString()。例子:

<DataTemplate DataType="{x:Type vm:ExampleViewModel}">
  <vw:ExampleView />
</DataTemplate>

通常,当 View 不接受任何参数时,这段代码会起作用。但是对于这个项目,我在 View 的构造函数参数中采用了 ViewModel:
public ExampleView(ExampleViewModel viewModel)
{
    InitializeComponent();
    DataContext = viewModel;
}

所以现在,我处于静止状态——这种类型的绑定(bind)只允许无参数的构造函数。

那么如何解决这个问题,同时仍然将 View 绑定(bind)到 ViewModel,其中所说的 View 具有构造函数参数?

最佳答案

我认为通过构造函数参数分配 DataContext 可能不是一个好主意,因为这是由 dataTemplate 自动完成的。 ,但对于任何其他参数,希望以下建议有所帮助!
首先,如果您想使用 ExampleView在 XAML 中,那么你需要有 默认构造函数 ,所以上面的构造函数(在你的问题中提到)是 不是 去上类。
我建议你在 ExampleView 中定义一个名为 ViewModel 的依赖属性。 ,然后从 XAML 中使用它。像这样的东西:

public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register
    (
         "ViewModel", 
         typeof(ExampleViewModel), 
         typeof(ExampleView), 
         new PropertyMetadata(null)
    );

    public ExampleViewModel ViewModel
    {
        get { return (ExampleViewModel)GetValue(ViewModelProperty ); }
        set { SetValue(ViewModelProperty , value); }
    }

    public ExampleView()
    {
        InitializeComponent();
    }
    //..........

}

然后你可以用 XAML 写这个:
<vw:ExampleView ViewModel="{Binding}" />

关于c# - WPF - 如何使用 XAML 中的参数将 ViewModel 绑定(bind)到 View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835033/

相关文章:

c# - 避免绑定(bind)错误的最佳实践

wpf - 在选项卡项中查找用户控件的子项

c# - XAML 分组 ListView : Changing a row background color

xaml - VS 2017 NetStandard XAML 智能感知

c# - 调用 log4net 包装器方法后未在日志中获取文件名和行号

c# number shaper for money amount 像 convert int 12333545 = 12,333,545

c# - 在 WPF 中执行静态 ComboBox 的有效方法

xaml - WebView GestureRecognition 在 Xamarin 表单中不起作用

c# - 以编程方式批处理文件以在夜间复制

c# - 如何将文本放在引号内