MVVM Light RelayCommand привязка не работает в пользовательском элементе управления - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю над приложением WPF, которое использует инструментарий MVVM Light.Я создаю мастер и хочу показать кнопки для перехода к предыдущему шагу и следующему шагу на каждой странице.Чтобы избежать дублирования кода, я использую пользовательский элемент управления, который предоставляет кнопки.

Я пытаюсь связать свойство 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!");
}

Я пытался использовать этот ответ , но не смог решить мою проблему.Заранее благодарю за поддержку!

...