ViewModel中的WPF绑定Listbox SelectedItem

时间:2014-10-21 07:17:57

标签: c# wpf xaml mvvm listbox

我正在使用WPF应用程序。主页面由一个包含2列和一行的网格组成。在第一列我有一个列表框,在第二列我有一个名为thePanel的stackpanel,我想在listbox.i的选定项目上更改。首先在View(mainwindow.xaml.cs)中使用selectionChanged事件实现列表框,它的工作原理。我试图应用MVVM所以我必须在viewModel中执行它。主窗口的数据上下文在其构造函数中设置,并且类型为UserViewModel。 userViewModel具有名为SelectedItem的Type ListBoxItem属性,该属性在XAML中绑定到我的列表框的SelectedItem。无论何时改变,我都会在UserViewModel中使用" Parent"直到MainWindow然后删除thePanel的所有子项并添加我想要的内容。 EntriesUC是一个UserControl,它在构造函数参数中获取dataContext。它没有问题,因为它在我在View中实现SelectionChanged时起作用。问题是每当我点击列表框中的任何项目时,都没有任何反应。

主窗口:

<Window x:Class="SyntheticLTM.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewNamespace="clr-namespace:SyntheticLTM.View"
        Title="MainWindow" WindowState="Maximized" Height="350" Width="525">

    <StackPanel>
        //MENU IMPLEMENTATIOn

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="4*"/>
            </Grid.ColumnDefinitions>

            <StackPanel Grid.Column="0">
                <Button Content="{Binding Name}" Width="84" />
                <ListBox Name="mainListBox" SelectionMode="Single" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
                    <ListBoxItem>Data entries</ListBoxItem>
                    <ListBoxItem>Categories</ListBoxItem>
                    <ListBoxItem>Favorites</ListBoxItem>
                    <ListBoxItem>Search</ListBoxItem>
                </ListBox>
            </StackPanel>

            <StackPanel Name="thePanel" Grid.Column="1"  />

        </Grid>
    </StackPanel>

</Window>

UserViewModel:

private ListBoxItem selectedItem;
 public ListBoxItem SelectedItem
            {
                get
                {
                    return selectedItem;
                }
                set
                {
                    selectedItem = value;
                    RaisePropertyChanged("SelectedItem");

                    var thePanel = new StackPanel();
                    thePanel=((((((selectedItem as ListBoxItem).Parent as ListBox).Parent as StackPanel).Parent as Grid).Parent as StackPanel).Parent as MainWindow).thePanel;
                    string message;
                    message = selectedItem.ToString();

                    if (message == "Data entries")
                    {
                        var allEntries = new CategoryViewModel();

                        foreach (var category in (thePanel.DataContext as UserViewModel).Categories)
                            allEntries.Entries = new ObservableCollection<EntryViewModel>(category.Entries);

                        thePanel.Children.Clear();
                        thePanel.Children.Add(new EntriesUC(allEntries));
                    }
// implementation for all the other list items...
                 }
               }

1 个答案:

答案 0 :(得分:0)

通常,您不会将ListBoxItems添加到ListBox,但您可以直接添加字符串,并使用字符串作为SelectedItem。 ListBox会自动用ListBoxItem包装每个字符串。但是如果你想这样做,你必须通过

提取所选字符串

message = selectedItem.Content.ToString();