none
WinRT Windows Class Library et MVVM : accès depuis le modèle à des propriétés ReadOnly. Utilisation des Behaviors ? RRS feed

  • Question

  • Bonjour, 

    je développe actuellement une bibliothèque de classes WinRT en c#/Xaml, qui sera intégrée dans une app windows 8. Elle utilise le design pattern MVVM. Les fichiers XAML sont des ressources imbriquées dans la dll, chargés au runtime via un XamlReader

    var xamlPageStream = typeof(EntryPoint).GetTypeInfo().Assembly.GetManifestResourceStream(nameInPackage);
    var sr = new StreamReader(xamlPageStream);
    var xamlPage = sr.ReadToEnd();
     return XamlReader.Load(xamlPage) as FrameworkElement;


    J'ai besoin d'avoir accès en lecture, depuis le viewmodel, a des propriétés ReadOnly de composants inclus dans mon Xaml. Pour être plus précis, je dois connaitre la valeur  ActualHeight / ActualWidth d'un canvas, depuis le viewmodel. 
    Dans le XAML, ces propriétés en ReadOnly ne sont pas bindables sur une propriétés du ViewModel. 

    Première question, connaissez vous un moyen d'accéder à la valeur de ces propriétés depuis le viewmodel ? 

    Mes recherches n'ont rien donné pour le moment, mais elles m'ont donné l'idée de tenter de passer par un behavior que j'ajouterais au composant canvas, pour récupérer et transmettre ailleurs la propriété recherchée lors du changement de taille par exemple. 

    J'ai donc essayer de créer un behavior personnalisé que je veux accoler au Control. J'ai ajouté la référence au Behavior SDK dans mon projet (DLL et programme appelant), puis je l'ai référencé dans ma page XAML. En code épuré : 

    <Page ...
    xmlns:Interactivity="clr-namespace:Microsoft.Xaml.Interactivity;assembly=Microsoft.Xaml.Interactivity" ...>
    
    [...]
    
    <ContentControl ...>
                <Interactivity:Interaction.Behaviors>
    
                </Interactivity:Interaction.Behaviors>
            </ContentControl>
     

    L'éditeur accepte et le programme compile. Cependant, au runtime, lors de la lecture via XamlReader j'obtiens une exception : 

    ParseException : The attachable property 'Behaviors' was not found in type 'Interaction'.

    Ai-je oublié quelque chose ? Ma méthode pourrait elle fonctionner ? 
    Comment se fait il que le XamlReader ne sache pas trouver le Behaviors, pourtant accessible via l'autocomplétion ? 

    Merci d'avance de vos réponses

    mercredi 11 février 2015 09:55

Toutes les réponses

  • Bonjour Bjorn,

    J'ai trouvé ce tutoriel: Windows 8 XAML Tips - Creating Blend Behaviors qui peut-être va vous donner une idée.

    Merci de nous tenir au courant.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 12 février 2015 09:31
    Modérateur
  • Merci de votre réponse, 

    le tutoriel propose globalement ce que j'avais tenté. Je l'ai repris du début pour être sûr, et le problème est bien celui décrit dans mon message initial. 
    J'ai adapté le code, jusque "Use ShowMessageAction" pour que cela puisse fonctionner (normalement...) dans une Class Library. 

    Voici le début de mon code XAML : 

    <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:DocIdWin8.Views"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Interactivity="clr-namespace:Microsoft.Xaml.Interactivity;assembly=Microsoft.Xaml.Interactivity"
        xmlns:Core="clr-namespace:Microsoft.Xaml.Interactions.Core;assembly=Microsoft.Xaml.Interactions"
        xmlns:Utils="clr-namespace:MyaApp.Utils"
        mc:Ignorable="d">
    
        <StackPanel>
    
    
            <Button Content="Load Test" RequestedTheme="Light" Command="{Binding LaunchTestCommand}" CommandParameter="launch">
                <Interactivity:Interaction.Behaviors>
                    <Core:EventTriggerBehavior EventName="Click">
                        <Utils:TestAction Text="Toto" />
                    </Core:EventTriggerBehavior>
                </Interactivity:Interaction.Behaviors>
            </Button>
    
    ....


    Il est OK dans l'éditeur, pas d'erreur (alors que c'est le cas si je me trompe, par exemple, sur le nom de l'assembly). 

    Par contre a l'exécution, comme expliqué plus haut, via chargement de XamlReader : 

    Une exception de première chance de type 'Windows.UI.Xaml.Markup.XamlParseException' s'est produite dans mscorlib.dll
    Informations WinRT : The attachable property 'Behaviors' was not found in type 'Interaction'. [Line: 16 Position: 14]

    Pensez vous que je doive traduire ce message et le mettre sur les forums anglais ? 

    Merci

    • Modifié Bjorn r jeudi 12 février 2015 10:24
    jeudi 12 février 2015 10:21