我有一段将集合绑定到 DataGrid 的代码,并且 DataGrid 的选择将允许在 TextBoxes 中进行详细编辑。
所以基本上 DataGrid 绑定到一个集合,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>