我创建一个依赖属性来关闭视图模型中的视图
dependencyProperty:
public static class WindowBehaviors
{
public static readonly DependencyProperty IsOpenProperty =
DependencyProperty.RegisterAttached("IsOpen"
, typeof(bool),
typeof(WindowBehaviors),
new UIPropertyMetadata(false, IsOpenChanged));
private static void IsOpenChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)
{
Window window = Window.GetWindow(obj);
if (window != null && ((bool)args.NewValue))
window.Close();
}
public static bool GetIsOpen(Window target)
{
return (bool)target.GetValue(IsOpenProperty);
}
public static void SetIsOpen(Window target, bool value)
{
target.SetValue(IsOpenProperty, value);
}
}
并在我的xaml中使用它,如下所示:
<window
...
Command:WindowBehaviors.IsOpen="True">
它可以工作,但当我想将它绑定到viewModel中的属性时,它不起作用,我想,它不工作,因为我稍后在xaml中定义了资源。
xaml:
<Window.Resources>
<VVM:myVieModel x:Key="myVieModel"/>
</Window.Resources>
我不知道该怎么办,我该把这个放在哪里:
Command:WindowBehaviors.IsOpen="{binding Isopen}"
public MainWindow()
{
InitializeComponent();
// DO THIS
this.DataContext = Resources["myVieModel"];
}
您需要为绑定所在的作用域绑定数据上下文。通常这在XAML中相当高,通常是表单或控件中的第一个元素。
在您的情况下,指向静态资源的数据上下文应该如下所示:
<grid DataContext="{StaticResource myVieModel}">
<!-- the code with the binding goß into here -->
</grid>
实际上,这和ebattulga建议的一样,只是XAML方式(没有代码隐藏)。
感谢您的帮助,我修复了它,这是我的解决方案,我以前使用MVVMToolkit,但现在我使用MVVMlight,正如你所知,在MVVMlight中,我们只在App.xaml中定义了一次应用程序资源。因此,我们可以简单地绑定所有窗口的属性,希望这能帮助一些有同样问题的人!!
app.xaml
<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
</Application.Resources>
和在窗口(视图)
DataContext="{Binding DefaultSpecItemVM, Source={StaticResource Locator}}"
而且效果非常好D