0 votes

Quel est le moyen le plus sûr de lier des données à un élément dans un autre fichier xaml en WPF ?

J'ai une application qui montre un arbre où l'on peut sélectionner des nœuds de l'arbre et les ajouter à une liste. Pour garder le code propre, j'ai déplacé le TreeView dans son propre UserControl (j'utilise cet arbre à plusieurs endroits) et dans un fichier xaml. Pour ajouter un nœud à la liste, je dispose d'un bouton "Ajouter". Cependant, je souhaite que ce bouton d'ajout soit grisé lorsqu'aucun des éléments de l'arborescence n'est sélectionné. Quel est le moyen le plus judicieux de le faire ? Je peux me lier à l'usercontrol complet et écrire un convertisseur plus compliqué, mais cela semble inélégant. Existe-t-il des solutions simples ?

J'aurais espéré que quelque chose du genre "ElementName=xamlFile.TargetElement" aurait fonctionné...

0voto

JSprang Points 3304

Voici comment je m'y prendrais. J'aurais un fichier Main.Xaml, qui aurait un fichier Main_ViewModel.Xaml comme contexte de données. Dans Main.Xaml, j'aurais un MyTreeViewControl et un Button. Pour le MyTreeViewControl, j'aurais également créé un MyTreeViewControl_ViewModel (qui utiliserait INotifyPropertyChanged). Dans le modèle Main_VeiwModel, je créerais la propriété MyTreeViewControl_ViewModel et je l'instancierais avec une nouvelle instance de MyTreeViewControl_ViewModel. Ensuite, dans le fichier Main.xaml, vous pourriez définir le DataContext de votre MyTreeViewControl comme étant cette propriété. Dans le Main_ViewModel, vous pourriez avoir une propriété Visibility à laquelle la visibilité des boutons 'Add' est liée. Dans le Main_ViewModel, vous pouvez vous inscrire à l'événement "PropertyChanged" du MyTreeViewControl_ViewModel. Dans cet événement, vous pouvez vérifier si votre "SelectedItem" a été modifié. Si c'est le cas, vous pouvez réévaluer et définir la propriété Visibility de votre bouton d'ajout.

Désolé, je n'ai pas eu le temps de donner un exemple de code. Je pourrais éventuellement vous en préparer un plus tard si vous en avez vraiment besoin. J'espère que cela vous aidera !

0voto

John Bowen Points 14985

Les commandes permettent de désactiver automatiquement les boutons qui les utilisent lorsque la commande ne peut pas s'exécuter. Si vous créez une commande et ajoutez des gestionnaires pour celle-ci dans votre UserControl, le bouton d'ajout externe peut utiliser la commande.

<local:TreeViewControl x:Name="Tree"/>
<Button Content="Add" Command="{x:Static local:TreeViewControl.AddCommand}" CommandTarget="{Binding ElementName=Tree}"/>

Création et accrochage de commandes :

public partial class TreeViewControl : UserControl
{
    public static RoutedCommand AddCommand { get; private set; }

    static TreeViewControl()
    {
        AddCommand = new RoutedCommand("AddCommand", typeof(TreeViewControl));
    }

    public TreeViewControl()
    {
        InitializeComponent();

        CommandBindings.Add(new CommandBinding(AddCommand, AddExecuted, AddCanExecute));
    }

    public void AddExecuted(object sender, ExecutedRoutedEventArgs e)
    {
    }

    public void AddCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = false; // your logic here
    }
}

Si vous utilisez MVVM, vous pouvez utiliser DelegateCommand ou RelayCommand pour faire des choses similaires à partir d'un ViewModel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X