MVVM Light RelayCommand绑定在用户控件中不起作用

时间:2018-11-21 19:16:55

标签: c# mvvm mvvm-light

我正在研究使用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,但未解决我的问题。预先感谢您的支持!

0 个答案:

没有答案