views:

65

answers:

2

Okay, so I'm fairly new to WPF and data binding, but I've searched and searched and can't seem to find an answer to this.

I have a database (called Inventory), and a dataset (called DevicesDataSet). What I'm trying to do is bind the dataset to a listbox, so that a specific device from the Devices table of the DevicesDataSet can be selected, and have its properties displayed in a TextBox for editing.

The following is the XAML I have so far:

<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>

Whenever a device is selected and a property is edited (I'm only displaying one property at the moment), the listbox is updated, but the dataset (database?) doesn't seem to be. That is, when I leave the form and then come back to it, the listbox returns to its original state.

So I guess the question is: how do I make these changes persist/write to the database?

Edit: Derp, here's the updated backend 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));
        }

    }
}
A: 

Have you looked in the Output window to check for binding errors? Because it looks to me like you have one. The TextBox is bound to the Make property, but its DataContext is the devicesViewSource resource. There's nothing associating it with the selected item in the ListBox.

A way to associate the two would be to assign the ListBox a name, and then set the binding on the TextBox to {Binding ElementName=MyListBox, Path=Make, Mode=TwoWay}.

Robert Rossney
That part works just fine, and when I edit the TextBox, the ListBox is updated as well. My issue isn't with the interface, but with the database not being updated. Also, the ListBox already has a name: "listBox1".
muad_dib