ふと気になりました。
BindingGroup.CommitEdit()がダメだと言っている状態で、移動するとどうなるのか。。。
結論は、
部分的に捨てられ、
部分的に保存されます。
- BindingGroup.CommitEdit()は、Falseを返します。変更はすべて保留になり、ソースは元のままです。
- そこで、無理やり移動すると:
- 保存できるBindingは、個別にソースへ保存します。
- 保存できないBindingは、ソースへ保存しません(できません)。元のままです。
- 一貫性は、どうなる?
次の図をご覧ください。
DataContextは、CollectionViewSourceに。
CollectionViewSource.Sourceは、DataTableになっています。
Windowに、BindingGroupを使用しています。
Name : 文字列
Comment : 文字列
Age : Int16整数
XAML:
<Window x:Class="WpfApplication21.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="687">
<FrameworkElement.BindingGroup>
<BindingGroup />
</FrameworkElement.BindingGroup>
<Grid>
<Label Content="Name:" HorizontalAlignment="Left" Margin="44,43,0,0" VerticalAlignment="Top"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="110,47,0,0" TextWrapping="Wrap" Text="{Binding Name}" VerticalAlignment="Top" Width="120"/>
<Label Content="Comment:" HorizontalAlignment="Left" Margin="21,93,0,0" VerticalAlignment="Top"/>
<TextBox HorizontalAlignment="Left" Height="122" Margin="110,97,0,0" TextWrapping="Wrap" Text="{Binding Comment}" VerticalAlignment="Top" Width="292" AcceptsReturn="True"/>
<Label Content="Age:" HorizontalAlignment="Left" Margin="55,237,0,0" VerticalAlignment="Top"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="110,237,0,0" TextWrapping="Wrap" Text="{Binding Age,TargetNullValue=''}" VerticalAlignment="Top" Width="120"/>
<Button Content="Back" HorizontalAlignment="Left" Margin="329,275,0,0" VerticalAlignment="Top" Width="75" Name="bBack" Click="bBack_Click" Height="34"/>
<Button Content="Next" HorizontalAlignment="Left" Margin="409,275,0,0" VerticalAlignment="Top" Width="75" Name="bNext" Click="bNext_Click" Height="34"/>
<Button Content="Save" HorizontalAlignment="Left" Margin="249,275,0,0" VerticalAlignment="Top" Width="75" Name="bSave" Click="bSave_Click" Height="34"/>
<Button Content="New" HorizontalAlignment="Left" Margin="169,290,0,0" VerticalAlignment="Top" Width="75" Name="bNew" Click="bNew_Click" />
<DataGrid HorizontalAlignment="Left" Margin="423,10,0,0" VerticalAlignment="Top" Height="209" Width="246" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />
</Grid>
</Window>
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication21 {
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
cvs.Source = dt;
DataContext = cvs;
}
DataSet1.DataTable1DataTable dt = new DataSet1.DataTable1DataTable();
CollectionViewSource cvs = new CollectionViewSource();
private void bBack_Click(object sender, RoutedEventArgs e) {
cvs.View.MoveCurrentToPrevious();
}
private void bNext_Click(object sender, RoutedEventArgs e) {
cvs.View.MoveCurrentToNext();
}
private void bSave_Click(object sender, RoutedEventArgs e) {
MessageBox.Show(BindingGroup.CommitEdit() + "");
}
private void bNew_Click(object sender, RoutedEventArgs e) {
dt.Rows.Add();
}
}
}
操作: