ListBox.SelectedIndex绑定

时间:2014-03-16 10:30:05

标签: c# .net wpf binding listbox

由于某些奇怪的原因,ListBox.SelectedIndex无法正常工作。我的ListBox定义如下:

<ListBox ItemsSource="{Binding Attachments}" SelectedIndex="{Binding SelectedAttachmentIndex}">

我的ViewModel中定义了属性AttachmentsSelectedAttachmentIndex。有两个按钮分别用于添加和删除附件。这两个按钮绑定到我的VM的两个ICommand对象。这些命令依次调用我的VM的AddAttachment()RemoveAttachment()功能。

添加新附件后,我想自动选择它。删除附件后,我想在该索引处选择新附件。除了最后一个要求之外,所有这些都可以正常工作,即ListBox在删除之后不会选择下一个附件。以下是RemoveAttachment()的代码:

public void RemoveAttachment(int index)
{
    if (index >= 0 && index < mDS.Attachment.DefaultView.Count)
    {
        mDS.Attachment.DefaultView[index].Row.Delete();
        mSelectedAttachmentIndex = Math.Min(mDS.Attachment.DefaultView.Count - 1, index);
        RaisePropertyChanged(this, "Attachments");
        RaisePropertyChanged(this, "SelectedAttachmentIndex");
    }
}

没有例外或错误。代码工作正常,mSelectedAttachmentIndex获取正确的值,但UI中的ListBox不能选择任何内容。我错过了什么?

注意:有趣的是,在AddAttachment()的情况下,它正确地选择了新添加的项目。

2 个答案:

答案 0 :(得分:1)

是的,出于某种原因,在更新ListBox的ItemsSource之后,SelectedIndex prop重置为-1,这就是Math.Min(mDS.Attachment.DefaultView.Count - 1,index)的结果始终为-1的原因。所以你可以这样做:

if (index >= 0 && index < mDS.Attachment.DefaultView.Count)
{
    int tempSelInd = index;
    mDS.Attachment.DefaultView[index].Row.Delete();
    mSelectedAttachmentIndex = Math.Min(mDS.Attachment.DefaultView.Count - 1, tempSelInd );
    RaisePropertyChanged(this, "Attachments");
    RaisePropertyChanged(this, "SelectedAttachmentIndex");
}

答案 1 :(得分:0)

终于找到了。 Attachments属性是罪魁祸首。发生的事情是Attachments属性(它是只读字符串数组)具有以下定义:

    public string[] Attachments
    {
        get
        {
            return mDS.Attachment.Where(row => row.RowState!= DataRowState.Deleted).Select(row2=>row2.Path).ToArray();
        }
    }

我基本上使用LINQ来创建投影。现在我所做的是每次绑定访问此属性时重新生成字符串数组,这反过来会将绑定的ListBox清空一段时间,从而将SelectedIndex设置为-1,这将反过来更新SelectedAttachmentIndex属性的值也是。之后,ListBox获得了新的字符串数组,但SelectedIndex却迷失了。

我现在更新了我的Attachments属性以直接返回DataTable,而不是创建投影。这一切都像魅力一样!