WPF绑定到嵌套List,Listbox不更新

时间:2017-06-28 12:06:34

标签: c# wpf mvvm binding

我正在尝试将我的列表绑定到另一个列表中另一个对象中的列表。但是在第二个列表框中,项目才会出现。

XAML

        <Window x:Class="Managing_program.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Managing_program"
        mc:Ignorable="d"
        Title="Dashboard" Height="416.701" Width="867.828">
    <Grid>
        <TabControl Margin="0,26,0,0">
            <TabItem Header="Tables">
                <Grid Background="White" Margin="0,0,-2,0">
                    <Button Content="Add" Margin="10,0,0,10" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="75" Command="{Binding AddTableCommand}"/>
                    <Button Content="Remove" Margin="90,0,0,10" HorizontalAlignment="Left" Width="75" Height="20" VerticalAlignment="Bottom" Command="{Binding RemoveTableCommand}"/>
                    <GroupBox Header="Fields" HorizontalAlignment="Left" Margin="204,0,0,35" Width="192" FontWeight="Bold">
                        <Grid ShowGridLines="False">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="30"/>
                            </Grid.RowDefinitions>

                            <ListBox Grid.Row="0" BorderThickness="2" ItemsSource="{Binding SelectedTable.Fields}" SelectedItem="{Binding SelectedField}" Margin="0 4" FontWeight="Normal">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel>
                                            <Label Content="test"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                            <TextBox Grid.Row="1" Margin="2" Text="{Binding FieldNameToAdd, Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}"/>

                        </Grid>
                    </GroupBox>

                    <GroupBox Header="Tables" HorizontalAlignment="Left" Width="199" Margin="0,0,0,35" FontWeight="Bold">

                        <Grid ShowGridLines="False">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="30"/>
                            </Grid.RowDefinitions>

                            <TextBox x:Name="tbAddTable" Grid.Row="1" Margin="2" Text="{Binding Path=TableNameToAdd, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

                            <ListBox Grid.Row="0"  ItemsSource="{Binding Tables}" SelectedItem="{Binding SelectedTable}" BorderThickness="2" Margin="0 4" FontWeight="Normal">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel>
                                            <Label Content="{Binding Name}"/>
                                            <Label Content= "{Binding Fields.Count, StringFormat='Fields: {0}'}"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>


                        </Grid>




                    </GroupBox>
                    <Button Content="Add" Margin="207,0,0,10" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="75" Command="{Binding AddFieldCommand}"/>
                    <Button Content="Remove" Margin="287,0,0,10" HorizontalAlignment="Left" Width="75" Height="20" VerticalAlignment="Bottom" Command="{Binding RemoveFieldCommand}"/>
                    <GroupBox Header="Field properties" Margin="401,0,10,35" FontWeight="Bold">
                        <Grid Margin="10,10,-2,5" ShowGridLines="True" DataContext="{Binding SelectedField}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="28"/>
                            </Grid.RowDefinitions>

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="200"/>
                            </Grid.ColumnDefinitions>

                            <Label Grid.Row="0" Grid.Column="0" Content="Name:"/>
                            <Label Grid.Row="1" Grid.Column="0" Content="Label:"/>
                            <Label Grid.Row="2" Grid.Column="0" Content="Type:"/>
                            <Label Grid.Row="3" Grid.Column="0" Content="Reference table:"/>
                            <Label Grid.Row="4" Grid.Column="0" Content="Visible:"/>

                            <Label Grid.Row="0" Grid.Column="1" Content="{Binding Name}" Margin="10,0,0,0"/>
                            <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Label}" Margin="5,2,0,2"/>

                            <ComboBox Grid.Column="1" Margin="5,5,0,5" Grid.Row="2" BorderBrush="White" RenderTransformOrigin="1.029,0.62">
                            </ComboBox>
                            <ComboBox Grid.Column="1" Margin="5,5,-0,121" Grid.Row="3" BorderBrush="White" RenderTransformOrigin="1.029,0.62">
                            </ComboBox>


                        </Grid>
                    </GroupBox>
                </Grid>
            </TabItem>
            <TabItem Header="TabItem">

            </TabItem>
        </TabControl>

    </Grid>
</Window>

MainViewModel:

        using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace Managing_program.model
{
    class MainWindowViewModel: ViewModelBase
    {



        public MainWindowViewModel()
        {
            // registering all commands
            Tables = new ObservableCollection<Table>();
            AddTableCommand = new DelegateCommand(ExecuteAddTableCommand, CanExecuteAddTableCommand);
            RemoveTableCommand = new DelegateCommand(ExecuteRemoveTableCommand, CanExecuteRemoveTableCommand);
            AddFieldCommand = new DelegateCommand(ExecuteAddFieldCommand, CanExecuteAddFieldCommand);

        }






        String _fieldNameToAdd = String.Empty;
        public String FieldNameToAdd {
            get { return _fieldNameToAdd; }
            set {
                _fieldNameToAdd = value;
                OnPropertyChanged("FieldNameToAdd");
            }
        }


        String _tableNameToAdd = string.Empty;
        public String TableNameToAdd {
            get {return _tableNameToAdd;}

            set {
                _tableNameToAdd = value;
                OnPropertyChanged("TableNameToAdd");
            }
        }


        #region allCommands:

        // Add Table Command
        public ICommand AddTableCommand { get; set; }

            private void ExecuteAddTableCommand(object parameter)
            {
            Tables.Add(new Table(TableNameToAdd));
                TableNameToAdd = String.Empty;
            }
            private bool CanExecuteAddTableCommand(object paramater)
            {
            if (TableNameToAdd.Length < 1)
                return false;

            if (TableNameToAdd.Contains(" "))
                return false;

            foreach (Table table in Tables)
                {
                if (table.Name.ToLower() == TableNameToAdd)
                    return false;
                }
            return true;
            }

        // Remove Table Command
        public ICommand RemoveTableCommand { get; set; }

            private void ExecuteRemoveTableCommand(object paramater){
            Tables.Remove(SelectedTable);
            }

            private bool CanExecuteRemoveTableCommand(object parameter)
            {
            return SelectedTable != null;
            }


        // AddFieldCommand
            public ICommand AddFieldCommand { get; set; }

        private void ExecuteAddFieldCommand(object parameter)
        {
            SelectedTable.Fields.Add(new Field("test"));

        }
            private bool CanExecuteAddFieldCommand(object parameter)
            {
            if (SelectedTable == null)
                return false;

            if (FieldNameToAdd.Length < 1)
                return false;

            if (FieldNameToAdd.Contains(" "))
                return false;

            foreach (Field field in SelectedTable.Fields)
            {
                if (field.Name.ToLower() == FieldNameToAdd.ToLower())
                    return false;
            }
            return true;
        }
        #endregion







        public ObservableCollection<Table> Tables { get; private set; }
        public Table SelectedTable { get; set; }
        public Field SelectedField { get; set; }


    }

}

表类:

        using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Managing_program.model
{
    class Table
    {
        public Table(String name)
        {
            Name = name;
            Fields  = new ObservableCollection<Field>();
        }

        public String Name { get; private set; }
        public ObservableCollection<Field> Fields { get; private set; }

    }

}

第二个列表框不会更新。请帮忙!

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题!我必须在SelectedTable属性中实现OnPropertyChanged()。在那之后它立即开始工作!