C# 从WPF中的DataTemplate绑定到命令

C# 从WPF中的DataTemplate绑定到命令,c#,wpf,xaml,data-binding,datatemplate,C#,Wpf,Xaml,Data Binding,Datatemplate,首先,提前感谢您的帮助 我有一个应用程序,我想添加一个导航菜单。我已经创建了一个DataTemplate,其中包含了我所有的按钮和样式,目前我的样式表中也有这些按钮和样式 <DataTemplate x:Key="Navigation"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="4*"/> <RowDefin

首先,提前感谢您的帮助

我有一个应用程序,我想添加一个导航菜单。我已经创建了一个DataTemplate,其中包含了我所有的按钮和样式,目前我的样式表中也有这些按钮和样式

<DataTemplate x:Key="Navigation">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="4*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <UniformGrid Grid.Row="0" Columns="1">
            <Button Visibility="{Binding ElementName=Menu, Path=IsChecked, Converter={StaticResource VisibilityConverter}}" Style="{StaticResource MenuButtonStyle}" >Page 1</Button>
            <Button Visibility="{Binding ElementName=Menu, Path=IsChecked, Converter={StaticResource VisibilityConverter}}" Style="{StaticResource MenuButtonStyle}" >Page 2</Button>
            <Button Visibility="{Binding ElementName=Menu, Path=IsChecked, Converter={StaticResource VisibilityConverter}}" Style="{StaticResource MenuButtonStyle}" >Page 3</Button>
            <Button Visibility="{Binding ElementName=Menu, Path=IsChecked, Converter={StaticResource VisibilityConverter}}" Style="{StaticResource MenuButtonStyle}" >Page 4</Button>
        </UniformGrid>
        <ToggleButton Grid.Row="1" Style="{StaticResource ToggleBtnToolStyle}" x:Name="Menu" IsChecked="true" Background="Transparent" BorderThickness="0" >
            <StackPanel Orientation="Horizontal">
                <ContentPresenter Margin="5" Height="50" Content="{StaticResource MenuIcon}"></ContentPresenter>
                <Viewbox>
                    <TextBlock Margin="5" Style="{StaticResource TxtToolStyle}">Menu</TextBlock>
                </Viewbox>
            </StackPanel>
        </ToggleButton>
    </Grid>
</DataTemplate>

第1页
第2页
第3页
第4页
菜单
目前,我唯一能够让它工作的方法是从DataTemplate中删除它,并在每个页面上实现网格。 是否有一种方法可以从存储在样式表中的数据模板绑定到NavigationViewModel? 很抱歉,如果这个问题的措辞很糟糕,我是WPF新手,可以做基本的数据绑定,但我在这里迷路了

谢谢

编辑

包含我要链接到的命令的ViewModel如下所示

public abstract class NavigationViewModelBase : ViewModelBase
{
    private List<DicomMetadataModel> _dicomMetadata;


    //Navigation Cmd
    public ICommand AcquisitionPageCmd { get; private set; }
    public ICommand ManualEntryWindowCmd { get; private set; }
    public ICommand SessionWindowCmd { get; private set; }
    public ICommand SettingsWindowCmd { get; private set; }
    public ICommand StudyInfoPageCommandCmd { get; private set; }
    public ICommand ViewerPageCmd { get; private set; }
    public ICommand WorklistPageCmd { get; private set; }


    protected NavigationViewModelBase()
    {
        AcquisitionPageCmd = new RelayCommand(() => Messenger.Default.Send(new GoToPageMessage(Pages.AcquisitionScreen)));
        ManualEntryWindowCmd = new RelayCommand(() => Messenger.Default.Send(new ShowDialogMessage(Pages.ManualEntry, DicomMetadata)));
        SessionWindowCmd = new RelayCommand(() => Messenger.Default.Send(new ShowDialogMessage(Pages.Session)));
        SettingsWindowCmd = new RelayCommand(() => Messenger.Default.Send(new ShowDialogMessage(Pages.Settings)));
        ViewerPageCmd = new RelayCommand(() => Messenger.Default.Send(new GoToPageMessage(Pages.Viewer)));
        WorklistPageCmd = new RelayCommand(() => Messenger.Default.Send(new GoToPageMessage(Pages.Worklist)));
    }
}
公共抽象类NavigationViewModelBase:ViewModelBase { 私有列表_dicomMetadata; //导航命令 公共ICommand AcquisitionPageCmd{get;private set;} 公共ICommand ManualEntryWindowCmd{get;private set;} public ICommand SessionWindowCmd{get;private set;} public ICommand SettingsWindowCmd{get;private set;} public ICommand StudyInfoPageCommandCmd{get;private set;} 公共ICommand ViewerPageCmd{get;private set;} 公共ICommand WorklistPageCmd{get;private set;} 受保护的NavigationViewModelBase() { AcquisitionPageCmd=new RelayCommand(()=>Messenger.Default.Send(新的GoToPageMessage(Pages.AcquisitionScreen)); ManualEntryWindowCmd=new RelayCommand(()=>Messenger.Default.Send(新建ShowDialogMessage(Pages.ManualEntry,DiCommMetaData)); SessionWindowCmd=new RelayCommand(()=>Messenger.Default.Send(新建ShowDialogMessage(Pages.Session)); SettingsWindowCmd=new RelayCommand(()=>Messenger.Default.Send(新建ShowDialogMessage(Pages.Settings)); ViewerPageCmd=newrelaycommand(()=>Messenger.Default.Send(newgotopagemessage(Pages.Viewer)); WorklistPageCmd=newrelaycommand(()=>Messenger.Default.Send(new-GoToPageMessage(Pages.Worklist)); } } }

他们在每一页我想添加的导航菜单的代码将如下所示

<ContentControl Grid.Column="2" Grid.Row="2" Content="{Binding}" ContentTemplate="{StaticResource Navigation }" />


您试图绑定到哪个控件的命令?我想转到另一个页面,因此当前的命令是viewerpage cmd=new RelayCommand(()=>Messenger.Default.Send(new GoToPageMessage(Pages.Viewer));目前我只是调用Command=“{Binding ViewerPageCmd”},但这必须在添加控件的viewmodel中声明。我希望减少在每个viewmodel中添加这些命令的次数您可以拥有viewmodel库,并且每个viewmodel都可以从库继承该命令。那么你就只有一个命令了,这会很好地工作,唯一的问题是我使用的是MVVM Light,所以我已经继承了它,使用了可观察的集合和其他附带的东西。