2012-04-04 7 views
0

Ich habe Stück Code, der eine Sammlung an das DataGrid bindet, und die Auswahl des DataGrid ermöglicht die Bearbeitung von Details in den TextBoxen.SelectedItem Event Feuer vor LostFocus, um die Quelle zu aktualisieren

Also im Grunde bindet DataGrid an eine Sammlung, bindet TextBoxen an das DataGrid.SelectedItem. (Eigenschaften).

Das Problem hier ist, wenn etwas in den TextBoxen editiert (sagen Sie ein Zeichen im Textfeld hinzufügen, ohne den Fokus zu verlieren), dann wählen Sie ein anderes Element in DataGrid (jetzt Fokus verloren). Das DataGrid wird die SelectedItem-Eigenschaft aktualisieren, aber jetzt sind die Änderungen, die für das vorherige Element vorgenommen werden sollen, nicht mehr vorhanden. Das PropertyChanged-Ereignis wurde nicht ausgelöst, wenn das Focus-Ereignis verloren gegangen ist.

Ich weiß, ich könnte es lösen, indem Sie UpdateTriggerSource=PropertyChanged verwenden, aber es gibt ziemlich viel Ereignis feuern um, wenn ich PropertyChanged verwende, also möchte ich sehen, ob es eine Lösung gibt, um dieses Problem zu lösen.

Und unten ist mein Beispielcode, um dieses Problem zu reproduzieren:

-Code-Behind:

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: von

<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> 

Antwort

0

Sie könnten hinzufügen und Logik zu dem Urlaub Veranstaltung das Textfeld, das bearbeitet wurde. Das sollte ausgelöst werden, bevor das Datagrid den Fokus erhält.

+0

Es wird nicht funktionieren. Standardmäßig ist das UpdateTriggerSource-Ereignis bereits LostFocous. Auch wenn Sie einen Stückcode für das Verlassen-Ereignis ('LostFocus') hinzufügen, wird er immer noch nach dem SelectedItem-Ereignis ausgelöst. Welche ersetzt Ihre Änderungen am vorherigen ausgewählten Element. –

Verwandte Themen