2009-04-29 11 views
3

J'ai créé une propriété attachée, AttachedBehaviorsManager.Behaviors, qui doit être utilisée comme une classe d'assistance MVVM qui lie les événements aux commandes. La propriété est de type BehaviorCollection (un wrapper pour ObservableCollection). Mon problème est que la commande de liaison pour le comportement finit toujours par être nulle. Lorsqu'il est utilisé sur les boutons, il fonctionne très bien.Éléments de la collection attachée Perdre le contexte de données

Ma question est pourquoi est-ce que je perds mon DataContext sur les éléments à l'intérieur de la collection, et comment puis-je le réparer?

<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> 

Répondre

0

Pourquoi vous lient à la commande? Les commandes sont destinées à être configuré ainsi:

<Button Command="ApplicationCommands.Open"/> 

Supposons que vous définissez une classe de commande comme ceci:

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

On peut l'utiliser comme ceci:

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

Le motif MVVM ISN ne s'applique pas comme vous l'utilisez. Vous devez placer le gestionnaire de commandes sur la machine virtuelle, mais les commandes elles-mêmes sont destinées à être dans le contexte statique. Veuillez vous référer au documentation on MSDN pour plus d'informations.

0

Vous liez à la commande car elle utilise le modèle MVVM (Model-View-ViewModel). Le datacontext de ce contrôle utilisateur est un objet ViewModel contenant une propriété qui expose la commande. Les commandes n'ont pas besoin d'être des objets statiques publics.

Les boutons dans le code indiqué n'ont aucun problème d'exécution. Ils sont liés à la SetTextCommand dans le viewmodel:

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; 
    } 
} 

Le problème est que la liaison au même SetTextCommand qui fonctionne dans les boutons ne sont pas reconnus dans le comportement: comportement.

Questions connexes