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>

SelectedItem事件在LostFocus更新源之前激发

您可以将和逻辑添加到已编辑的文本框的离开事件中。这应该在数据网格获得焦点之前启动。