开发者

how rebind silverlight datagrid

I am just doing simple example in Silverlight, which retrieves data from database, can also insert, update and delete

I use child window for insert command, when I click "OK" Button at this ChildWindow it insert's in database but not renders on page(Silverlight content), there is same records therefore in database really inserts information. only after again re-lunch this page, it shows correctly(retrieves all data from server)

I'll post my source

this is Customers.xaml file

<UserControl x:Class="Store.Customers"
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:mv="clr-namespace:Store.ViewModel"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
mc:Ignorable="d"
d:DesignHeight="500" d:DesignWidth="1000">

<UserControl.Resources>
    <mv:ViewModel x:Key="ViewModel"/>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="127*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="130*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="91*" />
        <RowDefinition Height="99*" />
        <RowDefinition Height="110*" />
    </Grid.RowDefinitions>

    <Button Name="btnEdit" Content="Edit" HorizontalAlignment="Right" Grid.Column="1" Width="55" Height="30"  Margin="0,225,0,0" Click="btnEdit_Click" />
    <data:DataGrid Name="dgCustomer"  
          AutoGenerateColumns="False" VerticalScrollBarVisibility="Visible"
          ItemsSource="{Binding PagedView, Mode=TwoWay, Source={StaticResource ViewModel}}" 
          Grid.Row="1" Grid.Column="1">

        <data:DataGrid.Columns>
            <data:DataGridTextColumn Header="ID" Binding="{Binding CustomerID}"/>
            <data:DataGridTextColumn Header="CompanyName" Binding="{Binding CompanyName}"/>
            <data:DataGridTextColumn Header="ContactName" Binding="{Binding ContactName}"/>
            <data:DataGridTextColumn Header="ContactTitle" Binding="{Binding ContactTitle}"/>
            <data:DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
            <data:DataGridTextColumn Header="City" Binding="{Binding City}"/>
            <data:DataGridTextColumn Header="Region" Binding="{Binding Region}"/>
            <data:DataGridTextColumn Header="PostalCode" Binding="{Binding PostalCode}"/>
            <data:DataGridTextColumn Header="Country" Binding="{Binding Country}"/>
            <data:DataGridTextColumn Header="Phone" Binding="{Binding Phone}"/>
            <data:DataGridTextColumn Header="Fax" Binding="{Binding Fax}"/>
            <data:DataGridCheckBoxColumn Header="IsCitizen" Binding="{Binding IsCitizen}"/>
        </data:DataGrid.Columns>
    </data:DataGrid>
    <data:DataPager HorizontalContentAlignment="Center" x:Name="myPager" 
                        Source="{Binding ItemsSource, ElementName=dgCustomer}" 
                        AutoEllipsis="True"
                        PageSize="10" Grid.Row="2" Grid.Column="1" VerticalAlignment="Top"/>
</Grid>

and this codebehinde

public partial class Customers : UserControl
{
    public Customers()
    {
        InitializeComponent();
    }

    private void btnEdit_Click(object sender, RoutedEventArgs e)
    {
        new AddNewCustomer().Show();            
    }

}

this is childwindow

<controls:ChildWindow x:Class="Store.AddNewCustomer"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
       xmlns:mv="clr-namespace:Store.ViewModel"
       Width="450" Height="350" 
       Title="AddNewCustomer" >

<controls:ChildWindow.Resources>
    <mv:ViewModel x:Key="ViewModel"/>
</controls:ChildWindow.Resources>

<Grid x:Name="LayoutRoot" Margin="2">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid>
        <Grid.RowDefinitions >
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions >
            <ColumnDefinition Width="30*"></ColumnDefinition>
            <ColumnDefinition Width="70*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="1" Grid.Column="0" Text="Customer ID :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtCustomerID" 
                 Text="{Binding CustomerID, Mode=TwoWay, Source={StaticResource ViewModel}}" />

        <TextBlock Grid.Row="2" Grid.Column="0" Text="Company Name :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtCompanyName" 
                 Text="{Binding CompanyName, Mode=TwoWay, Source={StaticResource ViewModel}}"/>

        <TextBlock Grid.Row="3" Grid.Column="0" Text="Contact Name :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtContactName" />

        <TextBlock Grid.Row="4" Grid.Column="0" Text="Contact Title :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtContactTitle" />

        <TextBlock Grid.Row="5" Grid.Column="0" Text="Address :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="5" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtAddressTitle" />

        <TextBlock Grid.Row="6" Grid.Column="0" Text="City :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="6" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtCity" />

        <TextBlock Grid.Row="7" Grid.Column="0" Text="Country :" VerticalAlignment="Center" Margin="2,0,0,0" />
        <TextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Center" Margin="2,0" x:Name="txtCountry" />
    </Grid>

    <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
    <Button x:Name="OKButton" Content="OK"  Width="75" Height="23" HorizontalAlignment="Right" Click="OKButton_Click"
            Margin="0,12,79,0" Grid.Row="1" Command="{ Binding AddNewCustomer, Mode=TwoWay, Source={StaticResource ViewModel} }"/>
</Grid>

this is My ViewModel

public class ViewModel : BaseViewModel
{

    #re开发者_如何学Gogion Fields

    public ObservableCollection<Customer> _items;
    public PagedCollectionView _view;
    public string _customerID;
    public string _companyName;

    #endregion

    #region Constructors

    public ViewModel()
    {
        if (!this.IsDesignTime)
            this.LoadCustomer();
    } 

    #endregion

    #region Properties

    public ICommand AddNewCustomer { get { return new AddNewCustomerInfo(this); } }

    public ObservableCollection<Customer> Items
    {
        get { return this._items; }
        set
        {
            this._items = value;
            this.OnPropertyChanged("Items");
        }
    }

    public PagedCollectionView PagedView
    {
        get { return this._view; }
        set
        {
            this._view = value;
            this.OnPropertyChanged("PagedView");
        }
    }

    public string CustomerID
    {
        get { return this._customerID;}
        set
        {
            this._customerID = value;
            this.OnPropertyChanged("CustomerID");
        }
    }

    public string CompanyName
    {
        get { return this._companyName; }
        set
        {
            this._companyName = value;
            this.OnPropertyChanged("CompanyName");
        }
    }

    #endregion

    #region Methods

    public void LoadCustomer()
    {
        DataServiceClient webService = new DataServiceClient();
        webService.GetCustomersCompleted += new EventHandler<GetCustomersCompletedEventArgs>(webService_GetCustomersCompleted);

        webService.GetCustomersAsync();
    }

    public void webService_GetCustomersCompleted(object sender, GetCustomersCompletedEventArgs e)
    {
        Items = e.Result;

        PagedCollectionView pageView = new PagedCollectionView(Items);
        pageView.PageSize = 10;
        PagedView = pageView;

    }

    public void CreateCustomer()
    {
        DataServiceClient webservice = new DataServiceClient();

        Customer cust = new Customer();
        cust.CustomerID = this.CustomerID;
        cust.CompanyName = this.CompanyName;
        webservice.InsertCustomerCompleted += new EventHandler<InsertCustomerCompletedEventArgs>(webservice_InsertCustomerCompleted);

        webservice.InsertCustomerAsync(cust);

        LoadCustomer();
    }

    void webservice_InsertCustomerCompleted(object sender, InsertCustomerCompletedEventArgs e)
    {
        this.CreateResult = e.Result;
    }

    #endregion


}

public class AddNewCustomerInfo : ICommand
{
    #region Fields

    public ViewModel ViewModel { get; set; }
    #endregion

    #region Constructors

    public AddNewCustomerInfo(ViewModel viewModel)
    {
        this.ViewModel = viewModel;
    }

    #endregion

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
            this.ViewModel.CreateCustomer();
    }
}

Grid and childwindow looks like this


As a simple basic solution, i would do this:

  • change your InsertCustomer web service call to return the updated Customer object that it just saved. This is so you will get an updated copy of the data object, complete with any keys/IDs. Doing this is a reasonably efficient way to do it, as you are making a call and accessing the database anyway, there is no point making two calls when it can be done in one.

  • once you've changed your webservice contract and regenerated your client proxy, the InsertCustomerCompletedEventArgs Result property should contain the updated Customer object. If you now add this data object to your PagedCollectionView it will automatically show up in your grid (as the PagedCollectionView implements INotifyCollectionChanged so the DataGrid binding will pick it up straight away, although be aware that paging may mean it isn't visible in the list you are currently looking at).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜