这是我的控制:
<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
?
答案 0 :(得分:1)
尝试将CommandParameter={Binding}
添加到<Button>
。这将通过ICommand.Execute
方法将所选项目的数据上下文传递到您的命令中。
否则,将命令属性移动到表示项的模型,而不是在根级别定义一组命令。我个人更喜欢这种方法。我喜欢我的命令是无参数的,并且总是对包含命令的视图模型类起作用。