SelectedItem事件在LostFocus更新源之前激发
本文关键字:更新 事件 LostFocus SelectedItem | 更新日期: 2023-09-27 18:29:55
我有一段代码将Collection绑定到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>
您可以将和逻辑添加到已编辑的文本框的离开事件中。这应该在数据网格获得焦点之前启动。