Collection を DataGrid にバインドするコードがあり、DataGrid を選択すると、TextBox で詳細を編集できます。
したがって、基本的に DataGrid は Collection にバインドし、TextBoxes は DataGrid.SelectedItem.(properties) にバインドします。
ここでの問題は、TextBoxes で何かが編集された場合 (たとえば、フォーカスを失うことなくテキスト ボックスに文字を追加した場合)、DataGrid で別の項目を選択した場合です (現在、フォーカスが失われています)。DataGrid は SelectedItem プロパティを更新しますが、以前の項目に加えるはずだった変更がなくなったため、失われたフォーカス イベントが発生したときに PropertyChanged イベントが発生しませんでした。
を使用すれば解決できることはわかっていUpdateTriggerSource=PropertyChanged
ますが、 を使用するとかなり多くのイベントがPropertyChanged
発生するため、この問題を解決する解決策があるかどうかを確認したいと考えています。
以下は、この問題を再現できるサンプルコードです。
コード ビハインド:
public partial class MainPage : UserControl
{
Person _SelectedPerson { get; set; }
public Person SelectedPerson
{
get
{
return this._SelectedPerson;
}
set
{
if (this._SelectedPerson == value)
return;
this._SelectedPerson = value;
}
}
public MainPage()
{
InitializeComponent();
Person personA = new Person() { FirstName = "Orange", LastName = "Cake" };
Person personB = new Person() { FirstName = "Apple", LastName = "Pie" };
ObservableCollection<Person> aPersonCollection = new ObservableCollection<Person>();
aPersonCollection.Add(personA);
aPersonCollection.Add(personB);
MyDataGrid.ItemsSource = aPersonCollection;
this.DataContext = this;
}
}
public class Person : INotifyPropertyChanged
{
string _LastName { get; set; }
public string LastName
{
get
{
return this._LastName;
}
set
{
if (this._LastName == value)
return;
this._LastName = value;
this.OnPropertyChanged("LastName");
}
}
string _FirstName { get; set; }
public string FirstName
{
get
{
return this._FirstName;
}
set {
if (this._FirstName == value)
return;
this._FirstName = value;
this.OnPropertyChanged("FirstName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(property));
}
XAML:
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel>
<sdk:DataGrid x:Name="MyDataGrid" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}" />
<TextBox Text="{Binding SelectedItem.FirstName, ElementName=MyDataGrid, Mode=TwoWay}" />
<TextBox Text="{Binding SelectedItem.LastName, ElementName=MyDataGrid, Mode=TwoWay}" />
</StackPanel>
</Grid>