Команда не работает для флажка

Я использовал команду Prism для многих элементов управления, но не могу заставить ее работать с флажком. Но он не работает для флажка. Я замечаю, что когда я размещаю точки останова в своих объявлениях свойств, они сбиваются, поэтому какая-то часть этого неверна. Вот мой код:

public class CheckBoxCommandBehavior : CommandBehaviorBase<CheckBox>
{
    public CheckBoxCommandBehavior(CheckBox checkableObj)
        : base(checkableObj)
    {
        checkableObj.Checked += new RoutedEventHandler(checkableObj_Checked);
        checkableObj.Unchecked +=new RoutedEventHandler(checkableObj_Checked);
    }

    private void checkableObj_Checked(object s, RoutedEventArgs e)
    {
        ExecuteCommand();
    }
}

public static class CheckBoxChecked
{
    private static readonly DependencyProperty CheckBoxCommandBehaviorProperty = DependencyProperty.RegisterAttached(
        "CheckBoxCommandBehavior",
        typeof(CheckBoxCommandBehavior),
        typeof(CheckBoxChecked),
        null);

    public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached(
        "Command",
        typeof(ICommand),
        typeof(CheckBoxChecked),
        new PropertyMetadata(OnSetCommandCallback));

    public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached(
        "CommandParameter",
        typeof(object),
        typeof(CheckBoxChecked),
        new PropertyMetadata(OnSetCommandParameterCallback));


    public static void SetCommand(CheckBox toggleBtn, ICommand cmd)
    {
        toggleBtn.SetValue(CommandProperty, cmd);
    }

    public static ICommand GetCommand(CheckBox toggleBtn)
    {
        return toggleBtn.GetValue(CommandProperty) as ICommand;
    }

    public static void SetCommandParameter(CheckBox selector, object parameter)
    {
        selector.SetValue(CommandParameterProperty, parameter);
    }

    public static object GetCommandParameter(CheckBox selector)
    {
        return selector.GetValue(CommandParameterProperty);
    }

    public static CheckBoxCommandBehavior GetOrCreateBehavior(CheckBox toggleBtn)
    {
        var behavior = toggleBtn.GetValue(CheckBoxCommandBehaviorProperty) as CheckBoxCommandBehavior;

        if (behavior == null)
        {
            behavior = new CheckBoxCommandBehavior(toggleBtn);
            toggleBtn.SetValue(CheckBoxCommandBehaviorProperty, behavior);
        }

        return behavior;
    }

    public static void OnSetCommandCallback(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        var toggleBtn = depObj as CheckBox;
        if (toggleBtn != null)
        {
            CheckBoxCommandBehavior behavior = GetOrCreateBehavior(toggleBtn);
            behavior.Command = e.NewValue as ICommand;
        }
    }

    private static void OnSetCommandParameterCallback(DependencyObject depObject, DependencyPropertyChangedEventArgs e)
    {
        var toggleBtn = depObject as CheckBox;
        if (toggleBtn != null)
        {
            CheckBoxCommandBehavior behavior = GetOrCreateBehavior(toggleBtn);
            behavior.CommandParameter = e.NewValue;
        }
    }
}

Я также создаю несколько флажков из шаблона данных внутри списка.

<ListBox x:Name="usersRoleAssociationsListBox" ItemsSource="{Binding UsersInRolesCollection}"
                                                 Height="180" 
                                                 Width="220"
                                                 Margin="5,5,5,5">
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <CheckBox
                                                        IsChecked="{Binding IsAssociated}"
                                                        cmd:CheckBoxChecked.Command="{Binding ClickToAssociateUserCommand}"
                                                        cmd:CheckBoxChecked.CommandParameter="{Binding Path=SelectedItem, ElementName=usersRoleAssociationsListBox}">
                                                    </CheckBox>
                                                    <TextBlock Text="{Binding UserName}"></TextBlock>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>

person Community    schedule 21.04.2011    source источник
comment
Итак, я нашел ответ по этой ссылке blog.kevindockx.com/post/. В основном при использовании DataTemplate DataContext по умолчанию является непосредственным родителем (в моем случае ListBox). Поэтому вы должны заставить его вернуться к ViewModel.   -  person    schedule 22.04.2011
comment
Теперь у меня другая проблема. Мой параметр команды возвращается к нулю. cmd:CheckBoxChecked.Command={Привязка DataContext.ClickToAssociateUserCommand, ElementName=RootUserControl} cmd:CheckBoxChecked.CommandParameter={Путь привязки=SelectedItem, ElementName=usersRoleAssociationsListBox}   -  person    schedule 22.04.2011


Ответы (1)


Поэтому я нашел ответ по этой ссылке blog.kevindockx.com/post/…. В основном при использовании DataTemplate DataContext по умолчанию является непосредственным родителем (в моем случае ListBox). Поэтому вы должны заставить его вернуться к ViewModel

person Community    schedule 05.05.2011