gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:52:17 30 4
gpt4 key购买 nike

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

这是我的代码结构:

我的命令类:

 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/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com