2017-10-31 2 views
-1

Ich bin neu in MVVM und habe Probleme mit einer einfachen Textbindung. Hier ist meine Ansicht:Ansicht zeigt keine aktualisierte Eigenschaft an

<UserControl x:Class="Project.ViewModels.SupportArchiveDialog" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf;assembly=MaterialDesignThemes.Wpf" 
     mc:Ignorable="d" 
     d:DesignHeight="100" d:DesignWidth="300"> 
<Grid Margin="16"> 
    <StackPanel Orientation="Vertical"> 
     <TextBlock Text="{Binding SupportArchivePath}" Margin="0 5 0 0" FontWeight="Bold" HorizontalAlignment="Center"></TextBlock> 
     <Button HorizontalAlignment="Center" HorizontalContentAlignment="Center" IsCancel="True" Margin="0 10 0 0" Style="{DynamicResource MaterialDesignFlatButton}" 
       Command="{x:Static wpf:DialogHost.CloseDialogCommand}"> 
      OK 
     </Button> 
    </StackPanel> 
</Grid> 

und mein Viewmodel:

using System; 
using System.ComponentModel; 
using Project.ViewModels; 
using MaterialDesignThemes.Wpf; 

namespace Project 
{ 
    public class DialogViewModel : INotifyPropertyChanged 
    { 
     private string _supportArchivePath; 

    public string SupportArchivePath 
    { 
     get { return _supportArchivePath; } 
     set 
     { 
      this.MutateVerbose(ref _supportArchivePath, value, RaisePropertyChanged()); 
     } 
    } 

    public async void ExecuteRunDialog(object o) 
    { 

     var view = new SupportArchiveDialog 
     { 
      DataContext = new DialogViewModel()    
     }; 

     //show the dialog 
     var result = await DialogHost.Show(view, "RootDialog", ClosingEventHandler); 

    } 

    private void ClosingEventHandler(object sender, DialogClosingEventArgs eventArgs) 
    { 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private Action<PropertyChangedEventArgs> RaisePropertyChanged() 
    { 
     return args => PropertyChanged?.Invoke(this, args); 
    } 
} 

}

und schließlich meine Implementierung (dieser Code-Block wird hinter meinem Hauptfenster im Code ausführen) :

 DialogViewModel dvm = new DialogViewModel(); 
     dvm.SupportArchivePath = archivePath; 
     dvm.ExecuteRunDialog(null); 

Ich würde erwarten, dass der Text in der Ansicht, der an die Eigenschaft "SupportArchivePath" gebunden ist, aktualisiert wird, wenn ich den Wert der Eigenschaft wie oben einstelle. Der Textblock ist jedoch leer, wenn ich mein Projekt starte. Irgendwelche Gedanken darüber, was ich vermisse?

+0

Klingt wie 'RaisePropertyChanged()' ist nicht immer Ausgelöst. Wenn du es einfach nach "this.MutateVerbose (...)" im Setter selbst aufruft, funktioniert das dann? – Nik

+0

Fehler beim Aktualisieren können eine beliebige Anzahl von Dingen sein. Sie sollten mit dem Debuggen beginnen. Sehen Sie sich die Debugger-Ausgabe an, um festzustellen, ob Fehler von WPF ausgegeben wurden. Wenn dies in Ordnung ist, setzen Sie Haltepunkte und gehen Sie durch den Code, um zu sehen, an welcher Stelle die Bindung fehlschlägt. Es kann sein, dass die Eigenschaft nicht so festgelegt wurde, wie Sie es erwartet haben, oder dass nichts das Ereignis abonniert hat (was auf ein Bindesyntaxproblem hinweist) oder dass das Ereignis nicht korrekt ausgelöst wird (entweder überhaupt nicht ausgelöst oder mit ausgelöst wird) der falsche Name der Eigenschaft). –

+1

Da Sie keine gute [mcve] bereitgestellt haben (die '' MutateVerbose() 'Methode, wohl die wichtigste hier, fehlt), ist es nicht praktisch zu versuchen, eine tatsächliche Antwort auf die Frage zu schreiben. –

Antwort

0

Es stellte sich heraus, dass ich gerade vor der Präsentation eine neue Instanz meines Viewmodells instanziierte - NACHDEM ich die Eigenschaft bereits gesetzt hatte, habe ich die Eigenschaft nie geändert. Das Update war, dies zu ändern:

DialogViewModel dvm = new DialogViewModel(); 
    dvm.SupportArchivePath = archivePath; 
    dvm.ExecuteRunDialog(null); 

und dieses

public async void ExecuteRunDialog(object o) 
    { 

    var view = new SupportArchiveDialog 
    { 
     DataContext = new DialogViewModel()    
    }; 

    //show the dialog 
    var result = await DialogHost.Show(view, "RootDialog", ClosingEventHandler); 

    } 

dieser

DialogViewModel dvm = new DialogViewModel(); 
dvm.SupportArchivePath = archivePath; 
dvm.ExecuteRunDialog(dvm); 

und diese

public async void ExecuteRunDialog(object o) 
{ 
    var view = new SupportArchiveDialog 
    { 
     DataContext = o    
    }; 

//show the dialog 
var result = await DialogHost.Show(view, "RootDialog", ClosingEventHandler); 

}