c# - wpf MvvM 命令数据上下文问题

标签 c# wpf mvvm model-binding command-pattern

我用谷歌搜索了所有我能找到的东西,但找不到我要找的东西。我有几个问题...

这是我的代码结构:

我的命令类:

 public class BrowseCommand : ICommand 
 {
   //Code here
 }

内部 View 模型:
public class ExampleViewModel
{
    public ExampleViewModel()
    {
        BrowseCommand = new BrowseCommand();
    }

    public ICommand BrowseCommand
    {
        get;
        private set;
    }
  //More Code...
}

MainWindow.xaml.cs:
 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ExampleViewModel();
    }
}

MainWindow.xaml:
Window x:Class="Ship32RcParser.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" >

   <Grid>
       <Button  Content="Browse" Command="{Binding BrowseCommand}"/>
       <Button  Content="Search" Command="{Binding I_NEED_HELP_HERE}"  />
   </Grid>
</Window>


我知道我的浏览器工作正常,因为 MainWindow.xaml.cs 有
DataContext = new ExampleViewModel();

但是我不喜欢那样
  • 我不想在 .cs 文件中包含任何内容
  • 我怎么有更多
    不止一个数据上下文 - 意思是如果我想从
    不同的 ViewModel 类...我知道它可能,但它会继续
    有点丑...

  • 当我在寻找解决方案时,我遇到了依赖项。例如我可以在我的 xaml 文件中做这样的事情
    xmlns:local="clr-namespace:myMvvMwpfProj.ViewModel"
    

    然后使用“本地”。但是,当我尝试它时,它并没有像我预期的那样工作......
    我也看到了类似的东西
    xmlns:local="using:myMvvMwpfProj.Command"
    

    有人也可以解释一下吗? “本地”是否让我可以访问类(class)?如果我有 CommandA、CommandB、CommandC 类。我应该能够做 local:CommandA.ExecuteFoo 吗?

    我想最大的问题是如何引用/访问来自不同对象的属性。在 Xaml 中

    谢谢大家

    最佳答案

    DataContext在 WPF 中是位于 UI 层后面的数据层。绑定(bind)用于从数据层查询属性以在 UI 层中使用。

    如果您的 UI 层将有两个按钮(浏览和搜索),那么您通常希望数据层有两个命令:BrowseCommandSearchCommand
    可以编写一个查询当前 DataContext 以外的内容的绑定(bind)。尽管。我实际上写了另一个 SO answer昨天关于这个,其中包含一些例子。

    最常见的方式是ElementNameRelativeSource ,这将
    在 VisualTree 中找到另一个 UI 元素,以便您可以将其用作绑定(bind)的源,如下所示:

    <Button Command="{Binding ElementName=SomeXAMLObjectName, 
                              Path=DataContext.BrowseCommand}" />
    
    <Button Command="{Binding 
                RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
                Path=DataContext.BrowseCommand}" />
    

    第三种选择是在 <XXXX.Resources> 中创建一个对象的实例。在 XAML 中,并使用它的 x:Key 将源设置为该实例, 像这样:
    <Window.Resources>
        <local:MyViewModel x:Key="MyViewModelInstance" />
    </Window.Resources>
    
    ...
    
    <Button Command="{Binding Source={StaticResource MyViewModelInstance}, 
                              Path=BrowseCommand}">
    

    也可以设置绑定(bind)的Source属性为静态对象,因此您无需在 .Resources 中创建对象的实例, 像这样:
    <Button Command="{Binding Source={x:Static local:MyStaticClass.BrowseCommand}}">
    

    但这仅适用于静态类,因为它实际上不会为绑定(bind)创建对象的新实例。

    回答你的另一个问题,当你写
    xmlns:local="clr-namespace:myMvvMwpfProj.ViewModel"
    

    您是在告诉 XAML 使用“本地”作为“myMvvMwpfProj.ViewModel”的快捷方式(xmlns 代表 XML Namespace),所以类似于 local:MyStaticClass.BrowseCommand表示绑定(bind)到 myMvvMwpfProj.ViewModel.MyStaticClass.BrowseCommand .

    如果您是 WPF 和 MVVM 的新手,我实际上建议您查看我专门为新的 WPF/MVVM 用户编写的几篇博客文章。
  • What is this "DataContext" you speak of?
  • A Simple MVVM Example

  • 它们将帮助您更好地了解 WPF 和 MVVM 模式的工作原理。

    关于c# - wpf MvvM 命令数据上下文问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526715/

    相关文章:

    c# - 获取已安装的 Windows 应用商店应用列表

    c# - Resharper 中的警告 "Return value of pure method is not used"

    c# - Model 应该如何让 ViewModel 知道其状态的变化?

    c# - .Net 单例属性的延迟初始化

    c# - 在 WPF Image 中鼠标悬停时显示不同的图像

    c# - 错误处理WPF-MVVM

    wpf - 有没有一种简单的方法可以绑定(bind)到 WPF 中的父行?

    mvvm - 剑道用户界面 : binding view model to datasource change

    c# - 当另一个属性更改时更新多个属性?

    c# - 查找没有根元素的节点值