2015年5月8日金曜日

BindingGroupとCollectionViewSourceとDataTableとナビゲーション

ふと気になりました。

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();
        }
    }
}


操作:


0 件のコメント:

コメントを投稿