2016-04-01 22 views
0

私のMainWindowでは、TextBoxコントロール(各列に1セット)と保存ボタンを持つDataGridとStackPanelがあります。WPF DataGridで明示的にソースDataTableを更新します。

ユーザーがDataGridで行を選択すると、現在の行の詳細がテキストボックスに表示されます。 テキストボックス内の情報を編集して保存することができます(保存中に、ソースが更新されますUpdateSourceTrigger =明示的に使用)

問題は、DataGridの別の行を選択するとソースが更新されることです。しかし、私は保存ボタンをクリックするだけで更新したいです。

サンプルコード:

MainWindow.xaml

<Window x:Class="PrismTestProject.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:PrismTestProject" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:Model x:Key="model"/> 
    </Window.Resources> 
    <DockPanel DataContext="{StaticResource model}"> 
     <DataGrid ItemsSource="{Binding Table, UpdateSourceTrigger=Explicit}" DockPanel.Dock="Left" IsSynchronizedWithCurrentItem="True"/> 
     <StackPanel DockPanel.Dock="Right"> 
      <WrapPanel> 
       <Label Content="Name" Width="100"/> <TextBox Name="tbxName" Text="{Binding Table/Name, UpdateSourceTrigger=Explicit}" Width="100"/> 
      </WrapPanel> 
      <WrapPanel> 
       <Label Content="Age" Width="100"/> 
       <TextBox Name="tbxAge" Text="{Binding Table/Age,UpdateSourceTrigger=Explicit}" Width="100"/> 
      </WrapPanel> 
      <WrapPanel> 
       <Label Content="Qualification" Width="100"/> 
       <TextBox Name="tbxQualification" Text="{Binding Table/Qualification,UpdateSourceTrigger=Explicit}" Width="100"/> 
      </WrapPanel> 
      <Button Click="SaveButton_Click" Content="Save"/> 
     </StackPanel> 
    </DockPanel> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void SaveButton_Click(object sender, RoutedEventArgs e) 
    { 
     tbxName.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
     tbxAge.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
     tbxQualification.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 
} 

Model.cs

public class Model 
{ 
    public DataTable Table { get; set; } 
    public Model() 
    { 
     this.Table = new DataTable("Sample"); 
     this.Table.Columns.Add("Name"); 
     this.Table.Columns.Add("Age"); 
     this.Table.Columns.Add("Qualification"); 

     this.Table.Rows.Add("User 1", "55", "PG"); 
     this.Table.Rows.Add("User 1", "40", "UG"); 
     this.Table.Rows.Add("User 1", "35", "UG"); 
     this.Table.Rows.Add("User 1", "60", "PG"); 
    } 
} 
+0

なぜ 'IsSynchronizedWithCurrentItem =" True "'を設定し、テキストボックスに値を取得するのですか? – AnjumSKhan

+0

@AnjumSKhanを参照してくださいhttp://www.interact-sw.co.uk/iangblog/2007/09/03/bindtocurrent – Saravanakumar

答えて

0

DataGridのSelectedItemのバインディングを作成します。

次に、SelectedItemのプロパティ 'Setterで、新しいプロパティにそのクローンを作成します。

情報パネルの要素をクローンオブジェクトにバインドします。その変更はすべて元の行に影響しません。

saveコマンドでは、クローンオブジェクトで変更されたプロパティを選択したオブジェクトにコピーして戻します。

関連する問題