2017-09-08 1 views
0

Ich bin dabei zu versuchen, meinen Kopf herum wie Prism und Unity innerhalb WPF arbeiten, aber derzeit durch eine einfache Aufgabe blockiert wurden. Möglicherweise habe ich ein Missverständnis darüber, wie es funktioniert.WPF So zurücksetzen/aktualisieren gebundenes Viewmodel bei der Verwendung von Prism/Unity

Wie aktualisiert man ein gebundenes Viewmodel?

Ich habe eine WPF-Anwendung mit Prisms RegionManager eine Benutzersteuerung zu laden:

<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" x:Name="mainContent" HorizontalAlignment="Center" Margin="0,25,0,0"/> 

In meiner Benutzerkontrolle ich ein Feld habe für einen Benutzer mit einer Submit-Button ausfüllen und Löschtaste (Gekürzt Benutzer Steuerinhalte)

<TextBox Margin="10,3,15,0" Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" MinWidth="150" materialDesign:HintAssist.Hint="*Last Name" Style="{StaticResource MaterialDesignFloatingHintTextBox}" FontSize="16"/> 
<Button Command="{Binding ClearCommand}" Style="{StaticResource MaterialDesignRaisedAccentButton}" Margin="0 12 8 0" Width="155" ToolTip="Discard information entered and reset form" Background="#FF990B0B" Foreground="#FFECE9E9" BorderBrush="DarkRed">Cancel and Discard</Button> 

meiner Feld Bindung funktioniert super und ich habe meine Taste auf einen Befehl gebunden, das ein Verfahren nennen, die ich möchte das Formular zurück:

public class CheckInViewModel : BindableBase 
{ 
    private IEventAggregator _eventAggregator; 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set { SetProperty(ref _lastName, value); } 
    } 

    public DelegateCommand ClearCommand { get; set; } 

    private void ExecuteClear() 
    { 
     //reset form here 
    } 
    public CheckInViewModel(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
     ClearCommand = new DelegateCommand(ExecuteClear); 
    } 
} 

Ich weiß, dass ich wahrscheinlich nur alle Felder manuell in der ExecuteClear-Methode zurücksetzen konnte, aber das scheint ein wenig klobig und fehleranfällig, da ich in Wirklichkeit 40 Felder zu behandeln habe.

Ich habe versucht, meine gebundenen Felder zu einem komplett separaten Modell zu bewegen, das Modell dann zu einer Eigenschaft meines Ansichtsmodells zu machen, damit ich es in der Clear-Methode erneut instanziieren kann, aber es scheint die Ansicht nicht zu aktualisieren. Ich stelle mir vor, dass ich einen Methodenaufruf verpassen muss, um mein letztes Modell zu lösen und an das neue zu binden, aber ich kann nicht herausfinden, wie es geht und kann keine Dokumentation darüber finden.

fehlgeschlagen Versuch Beispiel:

public class CheckInViewModel : BindableBase 
{ 
    private IEventAggregator _eventAggregator; 
    public CheckInModel checkInModel { get; set; } 
    public DelegateCommand ClearCommand { get; set; } 

    private void ExecuteClear() 
    { 
     checkInModel = new CheckInModel(); 
    } 

    public CheckInViewModel(IEventAggregator eventAggregator) 
    { 
     checkInModel = new CheckInModel(); 
     _eventAggregator = eventAggregator; 
     ClearCommand = new DelegateCommand(ExecuteClear); 
    } 

} 


public class CheckInModel : BindableBase 
{ 

    private string _lastName 
    public string LastName 
    { 
     get { return _lastName; } 
     set { SetProperty(ref _lastName, value); } 
    } 

} 


<TextBox Margin="10,3,15,0" Text="{Binding checkInModel.LastName, UpdateSourceTrigger=PropertyChanged}" MinWidth="150" materialDesign:HintAssist.Hint="*Last Name" Style="{StaticResource MaterialDesignFloatingHintTextBox}" FontSize="16"/> 
<Button Command="{Binding ClearCommand}" Style="{StaticResource MaterialDesignRaisedAccentButton}" Margin="0 12 8 0" Width="155" ToolTip="Discard information entered and reset form" Background="#FF990B0B" Foreground="#FFECE9E9" BorderBrush="DarkRed">Cancel and Discard</Button> 

Antwort

1

In Ihrem gescheiterten Versuch, die Eigenschaft checkInModel nicht PropertyChanged aufwirft, wenn Sie es in ExecuteClear aktualisieren.

ändern es zu

private CheckInModel _checkInModel; 
public ChechInModel CheckInModel 
{ 
    get { return _checkInModel; } 
    set { SetPropery(ref _checkInModel, value); } 
} 

private void ExecuteClear() 
{ 
    CheckInModel = new CheckInModel(); 
} 

<TextBox Text="{Binding CheckInModel.LastName}"/> 
<Button Content="Cancel and Discard" Command="{Binding ClearCommand}"/> 

und Sie sollten in Ordnung sein.

+0

Das war es, kann nicht glauben, dass ich das übersehen habe. Danke, dass du es eingefangen hast. –

Verwandte Themen