RelayCommand中的对象发送者始终为空

3
我使用RelayCommand处理按钮点击事件,但是我需要获取发送者参数,但它始终为空,您有任何想法吗?
ViewModel.cs
    private RelayCommand _expandClickCommand;
    public ICommand ExpandClickCommand
    {
        get
        {
            if (_expandClickCommand == null)
            {
                _expandClickCommand = new RelayCommand(ExpandClickCommandExecute, ExpandClickCommandCanExecute);
            }
            return _expandClickCommand;
        }
    }

    public void ExpandClickCommandExecute(object sender)
    {
        //sender is always null when i get here! 
    }
    public bool ExpandClickCommandCanExecute(object sender)
    {
        return true;
    }

View.xaml

<ListBox ItemsSource="{Binding Path=MyList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <Button Grid.Column="0" Grid.Row="0" Content="Expand" Command="{Binding DataContext.ExpandClickCommand,ElementName=SprintBacklog}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我需要在ExpandClickCommand中获取当前ListboxItem的索引。

也许发送者并不是我应该尝试获取的东西,我只需要索引。 - Eamonn McEvoy
1个回答

13

很有可能那个对象不是发送者,而是由控件传递的CommandParameter。你可以将按钮的CommandParameter绑定到自身来模拟sender

CommandParameter="{Binding RelativeSource={RelativeSource Self}}"

(但这可能并不能真正帮助你太多,所以想想你传递了什么来帮助你获得该值。)


现在我可以从发送方对象中获取一些内容,但似乎无法获取索引,我将该参数更改为传递ListBox,但CurrentItem属性始终为0。 - Eamonn McEvoy
@EamonnMcEvoy:什么是“CurrentItem”属性?ListBoxes没有这样的属性。你的命令到底在做什么?难道你不能用纯XAML的解决方案吗? - H.B.
@EamonnMcEvoy:你有没有考虑使用“DataContext”(当前项)并从数据列表中获取位置,或者是否存在某个视图在集合之上,因此列表的“IndexOf”将产生错误的值?即使如此,您也可能会设法获得该视图并从中获取正确的索引。 - H.B.
抱歉,我是指SelectedItem。我的XAML使用了在ViewModel中的对象列表来填充其ListBox,我在ViewModel中还有一个相应的Visibility对象列表,当我点击按钮时,我想要隐藏一些细节。因此,我需要SelectedItem的索引,以便我可以更新Visibility列表中的正确项目(我知道这是一个凌乱的解决方案,但我想不到另一种方法)。 - Eamonn McEvoy
1
@EamonnMcEvoy:只需使用字典,其中键是项,值是可见性,基本上这就是依赖属性的工作原理。使用索引确实很混乱。 - H.B.
@EamonnMcEvoy:或者你可以稍微改变你的架构,为每个项目创建一个视图模型,视图模型包含数据项和可见性属性,然后你就有了这些视图模型的列表。 - H.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接