Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:在主窗口和用户控件中绑定元素_Wpf_Mvvm_Binding_User Controls_Command - Fatal编程技术网

WPF:在主窗口和用户控件中绑定元素

WPF:在主窗口和用户控件中绑定元素,wpf,mvvm,binding,user-controls,command,Wpf,Mvvm,Binding,User Controls,Command,我是WPF和MVVM的新手,不知道如何解决这个(可能很简单)问题。我有一个带有两个区域的主窗口:RibbonView和下面的TabControl(Telerik)。我在ribbon控件中有一些大按钮,它们总是处于启用状态。例如,我有一个按钮“Tenants”,当我点击这个按钮时,我会创建一个新的选项卡项,并放置包含GridView控件的TenantControl(也来自Telerik)。其内容将自动加载 现在,我想让以下功能发挥作用:此外,我有一些默认禁用的小按钮(添加、删除、克隆等)(功能区控

我是WPF和MVVM的新手,不知道如何解决这个(可能很简单)问题。我有一个带有两个区域的主窗口:RibbonView和下面的TabControl(Telerik)。我在ribbon控件中有一些大按钮,它们总是处于启用状态。例如,我有一个按钮“Tenants”,当我点击这个按钮时,我会创建一个新的选项卡项,并放置包含GridView控件的TenantControl(也来自Telerik)。其内容将自动加载

现在,我想让以下功能发挥作用:此外,我有一些默认禁用的小按钮(添加、删除、克隆等)(功能区控件),我想在网格中选择项目时启用这些按钮。使用路由命令是解决问题的正确方法吗?如果在自己的用户控件中选择网格中的项目,如何启用主窗口中的按钮?是的,在主窗口中,我有一个对用户控件的引用。不需要代码,只需要一个概念——正如我之前所说的,我是WPF/MVVM的新手

谢谢你的帮助和问候,
Erno

在我的WPF应用程序中,我也经常使用
RibbonBar
s,但不是为不同的视图创建不同的
选项卡项
s,我使用
ContentControl
将它们全部显示在一个位置,然后只需将
Content
值更改为不同的视图模型,然后将这些视图模型渲染为相关视图:

main视图中

<ContentControl Content="{Binding ViewModel}" />

在App.xaml中:

<DataTemplate DataType="{x:Type ViewModels:SomethingViewModel}">
    <Views:SomethingView />
</DataTemplate>
此方法用于
ICommand.CanExecute
属性,以根据加载的视图模型启用和禁用
命令
s:

public ICommand CopyTrackList
{
    get { return new ActionCommand(action => ClipboardManager.SetClipboardText(
        ((ReleaseLabelCopyViewModel)ViewModel).TrackList), canExecute => 
        IsViewModelOfType<ReleaseLabelCopyViewModel>() &&
        ((ReleaseLabelCopyViewModel)ViewModel).SomePropertyInChildViewModel == true); }
}
公共ICommand CopyTrackList
{
获取{返回新操作命令(操作=>ClipboardManager.SetClipboardText(
((ReleaseLabelCopyViewModel)ViewModel).TrackList),canExecute=>
IsViewModelOfType()&&
((ReleaseLabelCopyViewModel)ViewModel).SomePropertyInChildViewModel==true);}
}

你好,谢里登,谢谢你的快速回复。我需要一些标签。每个控件都包含另一个用户控件,我需要从中访问功能区按钮的方法。如问题中所述,在用户控件中包含的网格中选择项目时,需要启用ribbon控件(主窗口中)中的按钮。在主视图中,我引用了不同的视图,这些视图进一步引用了viewmodels。谢谢,ErnoI编辑了我的上一个代码示例。。。现在,
ICommand
canExecute
部分检查当前是否加载了此特定视图模型,然后在启用
RibbonBar
中的
ICommand
之前,检查
SomePropertyInChildViewModel
属性是否为true。您可以执行相同的操作,并从子视图模型中公开一个
bool
属性,该属性表示是否在
网格中选择了该项。此外,您不需要使用
TabItem
s。。。您对
TabItem
s所做的一切都是我对设置所做不到的。。。不过,这取决于您。我想您应该将命令放置在使用命令的视图中。这是否正确?这些
ICommand
s在视图模型中声明,并通过数据绑定到
按钮上的
命令
属性和其他相关控件在视图中使用。您好,我找不到任何ActionCommand?还有一些其他类型的命令,如RoutedCommand/RoutedUICommand等,但没有像ActionCommand这样的命令。我找不到有关此操作类型的任何详细信息。。。
private bool IsViewModelOfType<T>()
{
    return ViewModel != null && ViewModel.GetType() == typeof(T);
}
public ICommand CopyTrackList
{
    get { return new ActionCommand(action => ClipboardManager.SetClipboardText(
        ((ReleaseLabelCopyViewModel)ViewModel).TrackList), canExecute => 
        IsViewModelOfType<ReleaseLabelCopyViewModel>() &&
        ((ReleaseLabelCopyViewModel)ViewModel).SomePropertyInChildViewModel == true); }
}