1

我有一段将集合绑定到 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>
4

1 回答 1

0

您可以为已编辑的文本框的离开事件添加逻辑。这应该在数据网格获得焦点之前触发。

于 2012-04-04T13:54:51.053 回答