2017-04-19 2 views
0

Ich verwende WPF Xceed.Wpf.Toolkit.PropertyGrid, um Eigenschaften meines Objekts für den Benutzer zu bearbeiten.PropertyGrid loser Fokus nach RefreshProperties.All

Meine Klasse Eigenschaft ist wie folgt:

private double height; 

[Browsable(true)] 
[RefreshProperties(RefreshProperties.All)] 
public double Height 
{ 
    get 
    { 
     return height; 
    } 

    set 
    {    
     bodymass = height * 10;//Some other property 
     _height= value; 
    } 
} 

Für jeden Tastendruck eingestellt() aufgerufen wird und die Startreihe verliert seinen Fokus aufgrund RefreshProperties.All. Aus diesem Grund ist es nicht möglich, kontinuierlich Werte in die Rasterzeile einzugeben.

Ist es möglich, sich auf die gleiche Eigenschaft zu konzentrieren, die ich eingegeben habe?

Oder zumindest, gibt es eine Möglichkeit, die set() nur dann aufgerufen werden, wenn der Benutzer klicken Sie auf Enter/lose Fokus?

Antwort

1

Sie sich von der RefreshProperties Attribut entfernen, implementieren die INotifyPropertyChanged Schnittstelle und erhöhen die PropertyChanged Ereignis für alle Eigenschaften, die Sie in der Setter der Height Eigenschaft aktualisieren möchten:

public class MyObject : INotifyPropertyChanged 
{ 
    private double height; 

    [Browsable(true)] 
    public double Height 
    { 
     get 
     { 
      return height; 
     } 

     set 
     { 
      height = value; 
      Test = height.ToString(); //this refreshes Test 
     } 
    } 

    private string _test; 
    public string Test 
    { 
     get { return _test; } 
     set { _test = value; NotifyPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

<xctk:PropertyGrid x:Name="_propertyGrid" Width="450" Margin="10" AutoGenerateProperties="False"> 
    <xctk:PropertyGrid.PropertyDefinitions> 
     <xctk:PropertyDefinition TargetProperties="Height" /> 
     <xctk:PropertyDefinition TargetProperties="Test" /> 
    </xctk:PropertyGrid.PropertyDefinitions> 
</xctk:PropertyGrid> 
+0

Dank sehr viel. Aber in diesem Fall muss ich so viele Hintergrundvariablen für alle anderen Eigenschaften erstellen. Richtig? – ParkAtStreet

+0

Nein, Sie können jede automatisch implementierte Eigenschaft aktualisieren, indem Sie die NotifyPropertyChanged-Methode aufrufen und den Namen der Eigenschaft übergeben, die Sie aktualisieren möchten, z. NotifyPropertyChanged ("TheNameOfThePropertyToUpdate"); – mm8

+0

Sie sollten auch alle datengebundenen Eigenschaften aktualisieren können, indem Sie der NotifyPropertyChanged-Methode eine leere Zeichenfolge oder null übergeben. – mm8

Verwandte Themen