双向绑定到数据集 - 更新数据库?

时间:2010-10-29 15:05:13

标签: c# sql wpf xaml binding

好的,所以我对WPF和数据绑定还不熟悉,但我搜索并搜索过,似乎无法找到答案。

我有一个数据库(称为Inventory)和一个数据集(称为DevicesDataSet)。我要做的是将数据集绑定到列表框,以便可以选择DevicesDataSet的Devices表中的特定设备,并将其属性显示在TextBox中进行编辑。

以下是我到目前为止的XAML:

<Window x:Class="Inventory.SignOutDevice"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SignOutDevice" Height="339" Width="392" xmlns:my="clr-namespace:Inventory" Loaded="Window_Loaded">
<Window.Resources>
    <my:DevicesDataSet x:Key="devicesDataSet" />
    <CollectionViewSource x:Key="devicesViewSource" Source="{Binding Path=Devices, Source={StaticResource devicesDataSet}}" />
</Window.Resources>
<Grid DataContext="{StaticResource devicesViewSource}">
    <ListBox Height="237" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBox1"
             VerticalAlignment="Top" Width="254" ItemsSource="{Binding}" SelectedValuePath="Selected">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Make}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <TextBox Margin="223,267,0,0" Text="{Binding Path=Make, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

每当选择一个设备并编辑一个属性时(我此刻只显示一个属性),列表框会更新,但数据集(数据库?)似乎不是。也就是说,当我离开表单然后回到它时,列表框将返回其原始状态。

所以我想问题是:如何将这些更改保留/写入数据库?

编辑:Derp,这是更新的后端C#:

using System.Windows;
using System.Data;
namespace Inventory
{
    public partial class SignOutDevice : Window
    {
        DevicesDataSet devicesDataSet = null;
        Inventory.DevicesDataSetTableAdapters.DevicesTableAdapter devicesDataSetDevicesTableAdapter = null;
        public SignOutDevice()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            devicesDataSet = ((Inventory.DevicesDataSet)(this.FindResource("devicesDataSet")));
            devicesDataSetDevicesTableAdapter = new Inventory.DevicesDataSetTableAdapters.DevicesTableAdapter();
            devicesDataSetDevicesTableAdapter.Fill(devicesDataSet.Devices);
            System.Windows.Data.CollectionViewSource devicesViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("devicesViewSource")));
            devicesViewSource.View.MoveCurrentToFirst();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            devicesDataSet.AcceptChanges();
            devicesDataSetDevicesTableAdapter.Update(devicesDataSet.Tables["Devices"].Select(null, null, DataViewRowState.Deleted));
            devicesDataSetDevicesTableAdapter.Update(devicesDataSet.Tables["Devices"].Select(null, null, DataViewRowState.ModifiedCurrent));
            devicesDataSetDevicesTableAdapter.Update(devicesDataSet.Tables["Devices"].Select(null, null, DataViewRowState.Added));
        }

    }
}

2 个答案:

答案 0 :(得分:0)

您是否在“输出”窗口中查看了绑定错误?因为它看起来像你有一个。 TextBox绑定到Make属性,但其DataContextdevicesViewSource资源。没有任何内容与ListBox中的所选项目相关联。

将两者关联起来的方法是为ListBox分配一个名称,然后将TextBox上的绑定设置为{Binding ElementName=MyListBox, Path=Make, Mode=TwoWay}

答案 1 :(得分:0)

好的,想通了。原来在devicesDataSetDevicesTableAdapter中自动生成的Update()方法实际上没有做任何事情。使用查询向导制作了一个自定义方法,现在一切都很好。