首页 > 解决方案 > 在我编辑其 itemssource(这是一个 DB)后,我无法更新列表框的内容

问题描述

我在 wpf 应用程序中有一个列表框,它从后台的 .mdf 本地数据库中获取其显示的数据。我有一个向列表框添加新数据的表单,但我无法让列表框更新/刷新以显示新添加的数据。

我的代码:

private void Add_Mitarbeiter_btn_Click(object sender, RoutedEventArgs e)
        {
            if (tb_Mitarbeiter_Nachname.Text == "" && tb_Mitarbeiter_Vorname.Text == "")
            {
                MessageBox.Show("Leer");
            } else
            {
                Mitarbeiter ma = new Mitarbeiter
                {
                    Vorname = tb_Mitarbeiter_Vorname.Text,
                    Nachname = tb_Mitarbeiter_Nachname.Text,
                    Belastung = 0
                };

                dataContext.Mitarbeiter.InsertOnSubmit(ma);
                dataContext.SubmitChanges();
            }

            UpdateMitarbeiterList();
        }

public void UpdateMitarbeiterList()
        {
            lb_Mitarbeiter.ItemsSource = null;
            lb_Mitarbeiter.ItemsSource = dataContext.Mitarbeiter;
            lb_Mitarbeiter.SelectedValuePath = "Id";
        }

还有我的 .xaml:

<ListBox x:Name="lb_Mitarbeiter"
                                 Height="250"
                                 Margin="2"
                                 BorderThickness="1"
                                 Style="{StaticResource VirtualisedMetroListBox}" 
                                 ItemTemplate="{StaticResource lbMitarbeiterTemplate}"
                            />

<Window.Resources>
        <DataTemplate x:Key="lbMitarbeiterTemplate">
            <StackPanel FlowDirection="LeftToRight"  Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Vorname}"></TextBlock>
                <TextBlock Text=" "></TextBlock>
                <TextBlock Text="{Binding Path=Nachname}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

将我的列表框的 ItemsSource 设置为 null,然后再次添加 ItemsSource 不起作用。

快速更新:我摆弄了一下,发现了一些奇怪的东西。我也调用 UpdateMitarbeiterList(); 应用程序 _OnLoad 方法中的方法。如果我不在那里调用它,但只有在我向数据库添加了一个新项目之后,它才会在列表框中显示这两个项目。因此,即使我将它设置为 null 并再次添加它,它似乎也没有正确地重新应用 ItemsSource。

编辑:添加了带有数据库定义的整个代码。

public partial class MainWindow : MetroWindow
    {
        LinqToSqlDataClassesDataContext dataContext;

        public MainWindow()
        {
            InitializeComponent();
            ThemeManager.ChangeAppStyle(Application.Current, ThemeManager.GetAccent("Red"), ThemeManager.GetAppTheme("BaseLight"));
            string connectionString = ConfigurationManager.ConnectionStrings["SCVT_Aufgabenplaner.Properties.Settings.SCVT_Aufgabenplaner_DBConnectionString"].ConnectionString;
            dataContext = new LinqToSqlDataClassesDataContext(connectionString);
        }

        private void MetroWindow_Loaded(object sender, RoutedEventArgs e)
        {
            UpdateMitarbeiterList();
        }

        public void UpdateMitarbeiterList()
        {
            lb_Mitarbeiter.ItemsSource = null;
            lb_Mitarbeiter.ItemsSource = dataContext.Mitarbeiter;
            lb_Mitarbeiter.SelectedValuePath = "Id";
        }

        #region Button Click Methoden
        private void Add_Mitarbeiter_btn_Click(object sender, RoutedEventArgs e)
        {
            if (tb_Mitarbeiter_Nachname.Text == "" && tb_Mitarbeiter_Vorname.Text == "")
            {
                MessageBox.Show("Leer");
            } else
            {
                Mitarbeiter ma = new Mitarbeiter
                {
                    Vorname = tb_Mitarbeiter_Vorname.Text,
                    Nachname = tb_Mitarbeiter_Nachname.Text,
                    Belastung = 0
                };

                dataContext.Mitarbeiter.InsertOnSubmit(ma);
                dataContext.SubmitChanges();
            }

            UpdateMitarbeiterList();
        }

        private void del_Mitarbeiter_btn_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(lb_Mitarbeiter.SelectedValue.ToString());
        }
        #endregion
    }

数据库定义:

CREATE TABLE [dbo].[Mitarbeiter] (
    [Id]        INT          IDENTITY (1, 1) NOT NULL,
    [Vorname]   VARCHAR (50) NOT NULL,
    [Nachname]  VARCHAR (50) NOT NULL,
    [Belastung] INT          NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

标签: c#databasewpflinqlistbox

解决方案


推荐阅读