0

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

这是我的代码结构:

我的命令类:

 public class BrowseCommand : ICommand 
 {
   //Code here
 }

内部视图模型:

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();

但是我不喜欢那样

  1. 我不想在 .cs 文件中有任何内容
  2. 我如何拥有多个数据上下文 - 意思是如果我想从不同的 ViewModel 类中获得命令......我知道它可能但它会有点难看......

当我在寻找解决方案时,我遇到了依赖项。例如我可以在我的 xaml 文件中做这样的事情

xmlns:local="clr-namespace:myMvvMwpfProj.ViewModel"

然后使用“本地”。然而,当我尝试它并没有像我预期的那样工作......我还看到了类似的东西

xmlns:local="using:myMvvMwpfProj.Command"

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

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

谢谢大家

4

3 回答 3

8

WPF 中的DataContext数据层位于 UI 层之后。绑定用于从数据层查询属性以在 UI 层中使用。

如果您的 UI 层将有两个按钮(浏览和搜索),那么您通常希望您的数据层有两个命令:BrowseCommandSearchCommand

可以编写一个查询当前以外的其他内容的绑定DataContext。实际上,我昨天为此写了另一个 SO答案,其中包含一些示例。

最常见的方法是ElementNameor RelativeSource,它将在 VisualTree 中找到另一个 UI 元素,因此您可以将其用作绑定的源,如下所示:

<Button Command="{Binding ElementName=SomeXAMLObjectName, 
                          Path=DataContext.BrowseCommand}" />

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

第三个选项是在 XAML 中创建一个对象的实例<XXXX.Resources>,并使用它将源设置为该实例x:Key,如下所示:

<Window.Resources>
    <local:MyViewModel x:Key="MyViewModelInstance" />
</Window.Resources>

...

<Button Command="{Binding Source={StaticResource MyViewModelInstance}, 
                          Path=BrowseCommand}">

您还可以将绑定的Source属性设置为静态对象,这样您就不需要在 中创建对象的实例.Resources,如下所示:

<Button Command="{Binding Source={x:Static local:MyStaticClass.BrowseCommand}}">

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

回答你的另一个问题,当你写

xmlns:local="clr-namespace:myMvvMwpfProj.ViewModel"

您是在告诉 XAML 使用“本地”作为“myMvvMwpfProj.ViewModel”(xmlns 代表XML 命名空间)的快捷方式,因此类似于local:MyStaticClass.BrowseCommand绑定到myMvvMwpfProj.ViewModel.MyStaticClass.BrowseCommand.

如果您是 WPF 和 MVVM 的新手,我实际上建议您查看我专门为新的 WPF/MVVM 用户编写的几篇博客文章。

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

于 2013-03-20T15:02:04.557 回答
2

您可以在视图中设置数据上下文<Grid DataContext = "{Binding}">

每个视图有 1 个视图模型,但可以有许多绑定命令!我建议你查看 Josh Smiths RelayCommand,因为这让这变得容易多了!指南在这里:

创建一个新类

class RelayCommand : ICommand
{
    private Action<object> _action;

    public RelayCommand(Action<object> action)
    {
        _action = action;
    }

    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
            _action(parameter);
    }

    #endregion
}

在你的 ViewModel

    public ICommand BrowseCommand {get; set;}
    public ICommand SearchCommand {get; set;}

    public ExampleViewModel()
    {
        this.BrowseCommand = new RelayCommand(new action<object>(MethodNameEnteredHere);
        this.SearchCommand = new RelayCommand(new action<object>(OtherMethodNameEnteredHere);
    }

所以,你的 xaml 将是

<Grid DataContext = "{Binding}">
       <Button  Content="Browse" Command="{Binding BrowseCommand}"/>
       <Button  Content="Search" Command="{Binding SearchCommand}"  />
 </Grid>
于 2013-03-20T14:47:06.027 回答
0

如果您希望您的视图使用来自各种视图模型的对象,您将必须:

  1. 在您的主 ViewModel 中有一些实例用于您想要使用的其他视图模型,因此您的绑定将类似于 {Binding AlternativeViewModelInstance.NewCommand}

  2. 在视图中找到需要绑定到不同数据上下文的区域,并将它们分成不同的视图-视图模型对。

于 2013-03-20T14:51:33.810 回答