1

Personタイプの監視可能なコレクションにバインドしているデータグリッドがあります。選択したアイテムはObjectPersonにバインドされています。ファーストネームとラストネームの2つのテキストボックスがあります。ユーザーがグリッドからアイテムを選択すると、テキストボックスの値が入力されます。ユーザーは値を編集して送信ボタンをクリックすると、値が更新されます。

ソースからターゲットは正しく機能します。つまり、viewModelから表示できるようになります。更新すると、値が更新されます。

ユーザーが名がjohn、lastname smithのアイテムを選択したとしましょう。問題は、ユーザーが名をjohnnyに編集し、送信ボタンをクリックせず、代わりにdatagridから別のアイテムを選択するため、元の選択したアイテムに戻ることです。グリッドでは、選択したアイテムはJohn smithとして表示されますが、テキストボックスでは、値はJohnnysmithとして表示されます。

4

2 に答える 2

1

皆さん、ありがとうございました。この問題は、非アクティブ化イベントを使用して解決されます。そのため、ユーザーがグリッド内の新しいアイテムをクリックするたびに、古いアイテムのDe_Activatingイベントは、データが元のアイテムから変更されているかどうかを確認します。変更されている場合は、ユーザーが新しいアイテムを探すか、戻って完了するように警告メッセージを表示します。編集。ユーザーが戻って編集を完了したい場合は、e.Cancel=trueを使用してイベントがキャンセルされます。アクティブレコードは古いアイテムのままです。ユーザーが新しい選択を続行すると、古い値がオブジェクトに復元されます。

私はもっ​​と良い解決策があるかもしれないと確信しており、私は間違いなく学びたいと思っています。あなたの努力に感謝します。ほんとうにありがとう。

于 2010-10-08T17:23:38.883 に答える
0

まず、DataGrid の SelectedItem を ObservableCollection の項目にバインドします。次に、TextBox コントロールを DataGrid (私の場合は SelectedCustomer) から同じ SelectedItem にバインドします。次に、INotifyPropertyChanged を実装して SelectedCustomer を更新し、ObservableCollection を SelectedCustomer と非同期に保ちます。最後に、必要に応じて、TextBox コントロールに UpdateSourceTrigger=PropertyChanged を含めて、TextBox への入力中に DataGrid を更新できます。

開始するために、以下のコード (ViewModelBase を除く) を含めました。

DataGrid と 2 つの TextBox コントロールを含む XAML を次に示します。

<Window x:Class="DataGridTextBox.Views.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:WpfToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
  Title="Main Window" Height="400" Width="800">
  <DockPanel>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <WpfToolkit:DataGrid  
            Grid.Column="0"
            SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"
            ItemsSource="{Binding Path=Customers, Mode=OneWay}" >
        </WpfToolkit:DataGrid>
        <StackPanel Grid.Column="1">
            <TextBlock Text="First Name"/>
            <TextBox Text="{Binding Path=SelectedCustomer.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBlock Text="Last Name"/>
            <TextBox Text="{Binding Path=SelectedCustomer.LastName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </StackPanel>
    </Grid>
  </DockPanel>
</Window>

以下は単純な ViewModel です。

public class MainViewModel : ViewModelBase
{

  public MainViewModel()
  {
     _customers = Customer.GetSampleCustomerList();
     _selectedCustomer = _customers[0];
  }

  private ObservableCollection<Customer> _customers = null;
  public ObservableCollection<Customer> Customers
  {
     get
     {
        return _customers;
     }
  }

  private Customer _selectedCustomer;
  public Customer SelectedCustomer
  {
     get
     {
        return _selectedCustomer;
     }
     set
     {
        _selectedCustomer = value;
        OnPropertyChanged("SelectedCustomer");
     }
  }
}

サンプル コードでは、ビューの DataContext を ViewModel に設定しました。

public partial class App : Application
{
  private void OnStartup(object sender, StartupEventArgs e)
  {
     // Create the ViewModel and expose it using the View's DataContext
     Views.MainView view = new Views.MainView();
     view.DataContext = new ViewModels.MainViewModel();
     view.Show();
  }
}

最後に、簡単な顧客定義:

public class Customer
{
  public String FirstName { get; set; }
  public String MiddleName { get; set; }
  public String LastName { get; set; }
  public String Address { get; set; }
  public Boolean IsNew { get; set; }

  // A null value for IsSubscribed can indicate 
  // "no preference" or "no response".
  public Boolean? IsSubscribed { get; set; }

  public Customer(String firstName, String lastName,
      String address, Boolean isNew, Boolean? isSubscribed)
  {
     this.FirstName = firstName;
     this.MiddleName = lastName;
     this.LastName = lastName;
     this.Address = address;
     this.IsNew = isNew;
     this.IsSubscribed = isSubscribed;
  }

  public static ObservableCollection<Customer> GetSampleCustomerList()
  {
     return new ObservableCollection<Customer>(new Customer[4] {
            new Customer("Jeff", "Zero", 
                "12 North Third Street, Apartment 45", 
                false, true), 
            new Customer("Joel", "One", 
                "34 West Fifth Street, Apartment 67", 
                false, false),
            new Customer("Jon", "Two", 
                "56 East Seventh Street, Apartment 89", 
                true, null),
            new Customer("Zamboni", "Three", 
                "78 South Ninth Street, Apartment 10", 
                true, true)
        });
  }
}
于 2010-10-06T22:06:49.137 に答える