C# 从WPF中的DataTemplate绑定到命令
首先,提前感谢您的帮助 我有一个应用程序,我想添加一个导航菜单。我已经创建了一个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 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,所以我已经继承了它,使用了可观察的集合和其他附带的东西。