Привязка команды внутри стиля - PullRequest
2 голосов
/ 29 февраля 2012

В настоящее время я работаю над приложением WPF, которое использует MVVM. У меня есть ListBox с установленным стилем, чтобы он отображался как RadioButtonList следующим образом:

<Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="{x:Null}" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Border Background="Transparent">
                                <RadioButton Focusable="False" IsHitTestVisible="False" IsChecked="{TemplateBinding IsSelected}" Content="{Binding Path=DisplayName}" Command="{Binding ElementName=ShippingWindow, Path=DataContext.ShipOtherMethodSelected}">
                                </RadioButton>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

<ListBox Name="lbShipOtherMethodOptions" Style="{StaticResource RadioButtonList}" ItemsSource="{Binding Path=ShipOtherMethodOptions}" Margin="13,74,366,282" />

То, что я пытаюсь сделать, это привязать команду к RadioButton, чтобы я мог запустить событие, когда сделан выбор. У меня есть следующий код в моей view-модели, но я не могу его запустить:

    private ICommand shipOtherMethodSelected;
    public ICommand ShipOtherMethodSelected
    {
        get
        {
            return shipOtherMethodSelected ??
                   (shipOtherMethodSelected = new RelayCommand(param => ShipOpenItems(), param => true));
        }
    }

    private void ShipOpenItems()
    {
        MessageBox.Show("GOT HERE");
    }

Я довольно новичок в WPF и MVVM, поэтому я, вероятно, упускаю что-то очевидное. Кто-нибудь может указать мне правильное направление?

EDIT: По предложению jberger, я вставил некоторый код, который я пытался, но он не работал. Установка точек останова в этом разделе не сработала, и не появилось окно сообщения.

РЕДАКТИРОВАТЬ 2: Поэтому после проверки DataContext на отправителе выясняется, что он указывает на объект, с которым я связываю RadioButton, а не на мою модель просмотра. Я обновил приведенный выше код (добавив x: Name в мое окно и обновив привязку Command), и теперь я получаю событие, которое запускается при его первоначальном связывании, но оно не запускается при выборе значения. Похоже, мы сейчас очень близко.

1 Ответ

4 голосов
/ 29 февраля 2012

ShipOtherMethodSelected находится в вашем (основном) ShippingVM НЕ в вашем ShipItemVM, поэтому вам нужно установить

Command="{Binding ElementName=ShippingWindow, Path=DataContext.ShipOtherMethodSelected}"

, где ShippingWindow - это x:Name элемента "над" ListBoxItem

Кроме того, Focusable="False" IsHitTestVisible="False" запрещает щелчок. Снимите сеттеры.

...