2016-06-24 8 views
-1

Das Ansichtsmodell:C# Prism: Einstellung Ansichtsmodell Eigenschaft von einem Controller (MVVM)

public class ConnectionStatusViewModel : BindableBase 
{ 

    private string _txtConn; 

    public string TextConn 
    { 
     get { return _txtConn; } 
     set { SetProperty(ref _txtConn, value); } 
    } 
} 

Die XAML:

<UserControl x:Class="k7Bot.Login.Views.ConnectionStatus" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:prism="http://www.codeplex.com/prism" 
      prism:ViewModelLocator.AutoWireViewModel="True" Width="300"> 

    <Grid x:Name="LayoutRoot">  
     <Label Grid.Row="1" Margin="10,0,10,0">connected:</Label> 
     <TextBlock Text="{Binding TextConn}" Grid.Row="1" Grid.Column="1" Margin="10,0,10,0" Height="22" /> 
    </Grid> 

</UserControl> 

The View:

public partial class ConnectionStatus : UserControl 
{ 
    public ConnectionStatus() 
    { 
     InitializeComponent(); 
    } 
} 

In einem weiteren Modul I haben einen Ereignis-Listener, der schließlich diesen Code ausführt:

aktualisieren

der Code ausgeführt wird, aber die TextConn wird aktualisiert und in der Benutzeroberfläche nicht

+0

Sind Sie sicher, dass Ihre '_connectionView'-Instanz diejenige ist, die angezeigt wird? Und warum verwenden Sie den 'ViewModelLocator', wenn Sie das Ansichtsmodell trotzdem injiziert haben? – Haukinger

+0

Die Ansichtsinjektion wurde entfernt. – keeg

Antwort

0

Nach einiger Fehlersuche Dieser Code funktioniert, war das Problem, dass ich diesen Code ausgeführt wurde:

ConnectionStatusViewModel viewModel = _connectionView.DataContext as ConnectionStatusViewModel; 
if (viewModel != null) 
{ 
    viewModel.TextConn = "Testing 123"; 

} 

, bevor die Ansicht tatsächlich aktiviert wurde. Dumm, aber vielleicht hilft es jemandem auf der ganzen Linie.

0

Sind Sie sicher, TextConn nicht angezeigt wird? Weil es aktualisieren kann, aber die Anzeige konnte nicht geändert werden. Sie sollten die INotifyPropertyChanged-Schnittstelle implementieren, und nachdem Sie Änderungen an TextConn vorgenommen haben, rufen Sie das implementierte OnPropertyChanged ("TextConn") auf. oder wie immer du die Funktion nennst. Dadurch wird der Benutzeroberfläche mitgeteilt, dass sich der Wert geändert hat und aktualisiert werden muss.

+0

Möglich, dass die Benutzeroberfläche nicht nur aktualisiert wird ... Müssen Sie INotifyProperyChanged implementieren, damit die Benutzeroberfläche aktualisiert wird? – keeg

+0

Sie haben Recht, es wird aktualisiert, nur nicht in der UI angezeigt – keeg

+0

'BindableBase' implementiert' INotifyPropertyChanged' ... Sie sollten sicherstellen, dass das Ansichtsmodell, das Sie aktualisieren, tatsächlich das gebundene ist. – Haukinger

0

Die UserControl DataContext erhält ihren Wert, wenn der UC initialisiert wird. Dann erhalten Sie eine Kopie des DataContext, umwandeln sie in ein Ansichtsmodellobjekt und ändern Sie die Eigenschaft. Ich glaube nicht, dass der UC in diesem Szenario seinen ursprünglichen DataContext aktualisiert.

Wahrscheinlich müssen Sie einen Nachrichtenmediator verwenden, um Änderungen zwischen verschiedenen Modulen zu kommunizieren.