多个ListBoxes及其SelectedItem的问题

时间:2018-03-22 22:11:36

标签: c# wpf listbox

我正在使用WPF(C#,Visual Studio 2010,MVVM Light)并且遇到三个Listbox控件的问题。

所以情况就是这样:我有三个Listbox。第一个是“示例”的ID列表。第二个也是“相关项目”的ID列表。它们是我的程序中的示例和相关项目,它们代表动词(如语言类型)。

如果单击这两个ListBox中的任何一个,它将填充第三个ListBox。两者互不影响,只有第三种。第三个不影响其他两个。第三个一次只能容纳一个项目。

除了一种情况外,它运作良好。假设'examples'ListBox包含ID 100002和100003.我们还说'相关项'ListBox包含ID 100004和100005.我单击100002,因此第一个ListBox的选定项成为该项。第三个列表框显示100002的详细信息(应该如此)。然后我点击100004上的第二个列表框。这成为第二个列表框的选定项目,第三个列表框显示100004.到目前为止。但现在我想说无论出于什么原因我想再回到100002。由于它仍然是第一个列表框中的选定项目,因此再次单击它无效。视图模型中的setter甚至没有被触发,因此我无法在那里做任何事情。事实上,我不确定在这种情况下我的选择是什么。我确实考虑过使用'examples'的setter来设置'相关项'的选定项为null,反之亦然,但我意识到这会导致无限循环。

我还尝试使用一个变量链接到前两个ListBoxes的选定项目,但这并没有解决问题。

我也尝试了以下内容:

private LanguageItemViewModel _selectedExampleOrRelatedItemTestVM = null;
    public LanguageItemViewModel SelectedExampleOrRelatedItemTestVM
    {
        get { return _selectedExampleOrRelatedItemTestVM; }
        set
        {
            if (_selectedExampleOrRelatedItemTestVM != value)
            {
                Mediator.EventMediator.Instance.PassLanguageItemAsExampleOrRelatedItem(value);
                _selectedExampleOrRelatedItemTestVM = null;
                RaisePropertyChanged("SelectedExampleOrRelatedItemTestVM");
            }
        }
    }

因此,在触发相关事件之后,变量本身只是设置为null。这也行不通。

也许有人在那里提出一些建议,甚至是一些我没有考虑过的途径?感谢。

1 个答案:

答案 0 :(得分:5)

我想出了两个选择:

1)将ListBox.SelectedItem与ViewModel的绑定设置为 OneWay 绑定,以避免在将ViewModel的属性设置为null时提到的无限循环。但由于它可能不是您想要的东西,也许您需要通过ViewModel更改SelectedItem,第二种方法会派上用场。

2)当用户点击ListBox并将 SelectedItem作为参数发送时,调用ViewModel的方法。类似的东西:

<强> XAML

<Window>
    ...
    <ListBox x:Name="ListBoxFirst" MouseUp="ListBox_OnMouseUp"/>
    ...
</Window>

并在View的CodeBehind文件中:

private void ListBox_OnMouseUp(object sender, MouseButtonEventArgs e)
{
    var viewModel = DataContext as YourViewModelType;

    if (viewModel != null && ListBoxFirst.SelectedItem != null)
    {
        viewModel.YourImplementedMethod(ListBoxFirst.SelectedItem);
    }
}

因此,每次用户再次点击该项时,都会重复调用该方法。

另外,您还可以通过BlendSDK库直接从XAML文件中调用该方法:

已编辑XAML

<Window xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    ...
    <ListBox x:Name="ListBoxFirst">

        <i:Interaction.Triggers>

            <i:EventTrigger EventName="MouseUp" SourceName="ListBoxFirst">
                <i:InvokeCommandAction Command="{Binding YourViewModelCommand}"
                 CommandParameter="{Binding ElementName=ListBoxFirst, Path=SelectedItem}"/>
            </i:EventTrigger>

        </i:Interaction.Triggers>

    </ListBox>
    ...
</Window>

交互性名称空间位于:

<强> System.Windows.Interactivity

祝你好运:)