2016-06-01 13 views
0

Ich habe eine UserControlBase mit einem Raster. Das Raster enthält eine Spalte mit einer Aktion.ICommand funktioniert nicht in Silverlight Benutzersteuerung

<sdk:DataGridTemplateColumn Header="Action"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Button Style="{StaticResource DataGridButton}" Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" Content="Modify" /> 
      </StackPanel> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

Mein Problem ist mit meiner Command. Es wirft mich technischen Fehler, der mein erstes Problem ist, ich weiß nicht, wie man diese Anwendung wirft mir die echte Fehlermeldung.

Im Code hinter meiner Benutzersteuerung registriert ich die Ereignisse:

protected void RegisterMessages() 
{ 
    Messenger.Default.Register<string>(this, "NewNewsBtn_Click", NewNewsBtn_Click); 
    Messenger.Default.Register<string>(this, "ModifyNewsBtn_Click", ModifyNewsBtn_Click); 
} 

Und in meinem Konstruktor:

public NewsWindow(int underlyingId) 
{ 
    InitializeComponent(); 
    this.RegisterMessages(); 
    viewModel = new NewsViewModel(underlyingId); 
    ucNewsPanel.DataContext = viewModel; 
} 

Meine Ansicht Modell (NewsViewModel)

public ICommand ModifyNewsCommand 
{ 
    get 
    { 
     return new RelayCommand<string>(e => 
     { 
      Messenger.Default.Send(string.Empty, "ModifyNewsBtn_Click"); 
     }); 
    } 
} 

Was ist seltsam hier ist, dass meine NewNewsBtn funktioniert, während meine ModifyNewsBtn ist nicht.

Dieser Knopf befindet sich außerhalb des Gitters, so dass es einen Unterschied machen kann, warum er funktioniert.

<Button x:Name="NewNewsBtn" MaxHeight="50" MaxWidth="100" Command="{Binding Path=NewNewsCommand}" Content="Add New" /> 
+0

Warum verwenden Sie einen Static in Ihrer Bindung, anstatt nur die Datacontext zugreifen? Sieht für mich so aus, als ob der Button nicht funktioniert. – Martin

+0

Ich denke, dieser Teil ist falsch ** Command = "{Binding Source = {StaticResource NewsViewModel}, Pfad = ModifyNewsCommand}" ** – ViVi

+0

@Martin - Wenn Sie die StaticResource entfernen und nur den Pfad verlassen, funktioniert es nicht. Es wirft keinen Fehler auf, aber es tritt nicht in die Methode ein. –

Antwort

1

Ihr DataGrid wird an eine Sammlung gebunden, die für jedes Element eine Zeile enthält. Jetzt ist das Element der DataContext für eine Zeile. Sie müssen den "Ändern" -Button an den übergeordneten DataContext binden. Wenn Sie silverlight5 verwenden, können Sie ein AncestorBinding verwenden:

<Button 
    Content="Modify" 
    Command="{Binding 
     Path=DataContext.ModifyNewsCommand, 
     RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
+0

Es hat funktioniert! Vielen Dank! –

0

Ihre Syntax sieht okay:

<Button Style="{StaticResource DataGridButton}" Content="Modify" 
    Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"/> 

Aber Sie setzen Ihr Ansichtsmodell im Code. Habe ich Recht, dass Sie StaticResource in XAML erstellen? Wenn dies der Fall ist, löschen Sie einfach die Einstellung DataContext von code-behind, da die folgende Zeile Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" in der anderen Instanz Ihres viewModel angezeigt wird. (Ursache Sie haben erstellen zwei Instanzen von NewsViewModel als StaticResource und in Code-behind)

Update:
brauchte ich den Datacontext in Code-behind, wie ich einen Parameter meiner Ansicht nach Modell bin vorbei. Kann ich das irgendwie, wenn ich es aus dem Code entferne?
Dann sollten Sie StaticResource von Bindung von Command löschen:

<Button Style="{StaticResource DataGridButton}" Command="{Binding ModifyNewsCommand}" 
                    Content="Modify"/> 

führen, dass Sie eine andere Instanz von NewsViewModel verweisen.

+0

Ich brauchte den 'DataContext' im Code, nachdem ich einen Parameter an mein View-Modell übergeben habe. Kann ich das irgendwie, wenn ich es aus dem Code entferne? –

+0

@GeraldGonzales bitte, siehe meine aktualisierte Antwort – StepUp

+0

die aktualisierte Antwort wird nicht funktionieren. Es kann das Ansichtsmodell nicht finden. –