我用谷歌搜索了所有我能找到的东西,但找不到我要找的东西。我有几个问题...
这是我的代码结构:
我的命令类:
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();
但是我不喜欢那样
不止一个数据上下文 - 意思是如果我想从
不同的 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 层将有两个按钮(浏览和搜索),那么您通常希望数据层有两个命令:BrowseCommand
和 SearchCommand
可以编写一个查询当前 DataContext
以外的内容的绑定(bind)。尽管。我实际上写了另一个 SO answer昨天关于这个,其中包含一些例子。
最常见的方式是ElementName
或 RelativeSource
,这将
在 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 用户编写的几篇博客文章。
它们将帮助您更好地了解 WPF 和 MVVM 模式的工作原理。
关于c# - wpf MvvM 命令数据上下文问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526715/