如何在我的自定义控件WPF中正确绑定命令

时间:2013-06-13 16:43:01

标签: wpf xaml selecteditem relaycommand

这是我的控制:

<UserControl.Resources>
    <DataTemplate x:Key="ItemTemplate">
        <Border BorderThickness="0.5" BorderBrush="DarkGray">
            <Grid Height="30">
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <CheckBox Command="{Binding DataContext.CheckCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" Content="{Binding Name}" IsChecked="{Binding IsChecked}"  Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Width="Auto"/>

                <Button Command="{Binding DataContext.UpCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"
                                    Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Margin="1" ToolTip="Up" BorderBrush="{x:Null}" Background="{x:Null}">
                    <Image Source="/Resources/Icons/sort_up.png"/>
                </Button>

                <Button 
                        Command="{Binding DataContext.DownCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"
                        Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" Margin="1" ToolTip="Down" BorderBrush="{x:Null}" Background="{x:Null}">
                    <Image Source="/Resources/Icons/sort_down.png"/>
                </Button>

            </Grid>
        </Border>
    </DataTemplate>
</UserControl.Resources>

视图模型中的代码包括:

/// <summary>
    /// Moves item up in the custom list
    /// </summary>
    private void UpCommandExecuted()
    {
        if (SelectedItem != null)
        {
            StoredProc Proc = SelectedItem;
            int oldLocation = TheList.IndexOf(SelectedItem);
            if (oldLocation > 0)
            {
                if (SelectedItem.IsChecked || (TheList[oldLocation - 1].IsChecked == SelectedItem.IsChecked))
                {
                    TheList.RemoveAt(oldLocation);
                    TheList.Insert(oldLocation - 1, Proc);
                    SelectedItem = Proc;
                }
            }
        }
    }

我在VM中也有一个SelectedItem属性StoredProcedure(我编写的类型)。这是有效的,但单击任何列表框的项目“向上”按钮会导致SELECTEDITEM被操作。我实际上想要单击按钮进行操作的列表框项目。我怎样才能做到这一点?如何告诉我的UpCommandExecuted()方法对ListBoxItem进行操作,我点击了向上按钮,而不是实际的SelectedItem

1 个答案:

答案 0 :(得分:1)

尝试将CommandParameter={Binding}添加到<Button>。这将通过ICommand.Execute方法将所选项目的数据上下文传递到您的命令中。

否则,将命令属性移动到表示项的模型,而不是在根级别定义一组命令。我个人更喜欢这种方法。我喜欢我的命令是无参数的,并且总是对包含命令的视图模型类起作用。