2009-04-29 12 views
3

Ich habe eine angefügte Eigenschaft AttachedBehaviorsManager.Behaviors erstellt, die als MVVM-Hilfsklasse verwendet werden soll, die Ereignisse mit Befehlen verknüpft. Die Eigenschaft ist vom Typ BehaviorCollection (ein Wrapper für ObservableCollection). Mein Problem ist, dass die Bindung für den Befehl "Behaviour" immer Null ist. Bei Verwendung auf den Tasten funktioniert es jedoch gut.Angehängte Sammlungselemente Datenkontext verlieren

Meine Frage ist, warum verliere ich meine DataContext auf Elemente innerhalb der Sammlung, und wie kann ich es beheben?

<UserControl x:Class="SimpleMVVM.View.MyControlWithButtons" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:behaviors="clr-namespace:SimpleMVVM.Behaviors" 
      xmlns:con="clr-namespace:SimpleMVVM.Converters" 
Height="300" Width="300"> 
<StackPanel> 
     <Button Height="20" Command="{Binding Path=SetTextCommand}" CommandParameter="A" Content="Button A" /> 
    <Button Height="20" Command="{Binding Path=SetTextCommand}" CommandParameter="B" Content="Button B"/> 
    <TextBox x:Name="tb" Text="{Binding Path=LabelText}"> 
     <behaviors:AttachedBehaviorsManager.Behaviors> 
      <behaviors:BehaviorCollection> 
       <behaviors:Behavior Command="{Binding Path=SetTextCommand}" CommandParameter="A" EventName="GotFocus"/> 
      </behaviors:BehaviorCollection> 
     </behaviors:AttachedBehaviorsManager.Behaviors> 
    </TextBox> 
</StackPanel> 

Antwort

0

Warum auf den Befehl verbindlich sind Sie? Befehle sollen eingerichtet werden auf diese Weise:

<Button Command="ApplicationCommands.Open"/> 

Angenommen, Sie eine Befehlsklasse definieren wie folgt:

namespace SimpleMVVM.Behaviors { 
    public static class SimpleMvvmCommands { 
     public static RoutedUICommand SetTextCommand { get; } 
    } 
} 

Sie würden es verwenden, etwa so:

<Button Command="behaviors:SimpleMvvmCommands.SetTextCommand"/> 

Das MVVM Muster isn 't anwendbar, wie Sie es benutzen. Sie würden den Befehlshandler auf die VM setzen, aber die Befehle selbst sollen sich im statischen Kontext befinden. Weitere Informationen finden Sie unter documentation on MSDN.

0

Sie binden an den Befehl, da dies das MVVM-Muster (Model-View-ViewModel) verwendet. Der Datenkontext dieses Benutzersteuerelements ist ein ViewModel-Objekt, das eine Eigenschaft enthält, die den Befehl verfügbar macht. Befehle müssen keine öffentlichen statischen Objekte sein.

Die Tasten im angezeigten Code haben kein Problem bei der Ausführung. Sie sind in dem Viewmodel an die SetTextCommand gebunden:

class MyControlViewModel : ViewModelBase 
{ 
    ICommand setTextCommand; 
    string labelText; 

    public ICommand SetTextCommand 
    { 
     get 
     { 
      if (setTextCommand == null) 
       setTextCommand = new RelayCommand(x => setText((string)x)); 
      return setTextCommand; 
     } 
    } 
    //LabelText Property Code... 

    void setText(string text) 
    { 
     LabelText = "You clicked: " + text; 
    } 
} 

Das Problem ist, dass auf den gleichen SetTextCommand die Bindung, die in den Tasten arbeitet nicht im Verhalten erkannt wird: Verhalten.

Verwandte Themen