我正在研究使用MVVM Light工具箱的WPF应用程序。我正在创建一个向导,我想在每个页面上显示用于导航到上一步和下一步的按钮。为了避免代码重复,我使用了提供按钮的用户控件。
我正在尝试将下一个按钮的Command
属性绑定到一个依赖属性,该属性在文件后面的代码NextStepCommand
中定义。此属性的类型为RelayCommand
。然后,应将用户控件的依赖项属性NextStepCommand
绑定到具有完全相同名称NextStepCommand
的窗口属性;当然它也是RelayCommand
类型的。
但是,从窗口属性NextStepCommand
到按钮属性Command
的绑定不起作用。将窗口的属性NextStepCommand
绑定到窗口的XAML文件中定义的任意按钮,效果很好;在类后面的用户控件代码中实现RelayCommand
并将其绑定到用户控件中定义的下一个按钮也是如此。但是,从窗口属性到用户控件按钮的完整链接不起作用,我无法找到解决方案。
用户控件的XAML代码如下所示。
<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}">
<DockPanel>
<Button DockPanel.Dock="Left"
IsEnabled="{Binding Path=PreviousStepEnabled}"
Command="{Binding Path=PreviousStepCommand}">Back</Button>
<Button DockPanel.Dock="Right"
IsEnabled="{Binding Path=NextStepEnabled}"
Command="{Binding Path=NextStepCommand, Mode=OneWay}">Next</Button>
<Label/>
</DockPanel>
</UserControl>
用户控件的NextStepCommand
的定义如下:
public RelayCommand NextStepCommand
{
get { return (RelayCommand)GetValue(NextStepCommandProperty); }
set { SetValue(NextStepCommandProperty, value); }
}
public static readonly DependencyProperty NextStepCommandProperty =
DependencyProperty.Register(nameof(NextStepCommand), typeof(RelayCommand), typeof(WizardStepSwitchBar), new PropertyMetadata(default(RelayCommand)));
该窗口的XAML显示在下面。
<MahApps:MetroWindow
xmlns:MahApps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
DataContext="{Binding Source={StaticResource Locator}, Path=BasicSettings}">
<Grid Style="{StaticResource MainContainerMargin}">
<control:WizardStepSwitchBar Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" PreviousStepEnabled="False" NextStepCommand="{Binding Path=NextStepCommand, Mode=OneWay}"/>
</Grid>
</MahApps:MetroWindow>
窗口的NextStepCommand
属性的实现非常简单:
public RelayCommand NextStepCommand
{
get
{
return new RelayCommand(this.OnNextStep);
}
}
private void OnNextStep()
{
MessageBox.Show("It works!");
}
我尝试使用this answer,但未解决我的问题。预先感谢您的支持!