Maison > développement back-end > Tutoriel C#.Net > Une brève discussion sur les expressions de liaison dans WPF

Une brève discussion sur les expressions de liaison dans WPF

零下一度
Libérer: 2017-06-24 09:55:54
original
4090 Les gens l'ont consulté

Qu'il s'agisse de définir un contrôle ou un contrôle utilisateur, une fonction sera utilisée - liaison. Le nom écrit : liaison d'élément. Cela signifie que les éléments liés peuvent réaliser la synchronisation des données. De l'avis de l'auteur, l'introduction de cette fonctionnalité dans WPF est vraiment parfaite. La programmation est plus concrète. Surtout lorsqu'il est combiné avec le modèle MVVM, il est parfait. L'auteur n'est pas un universitaire. Il serait irréaliste de le raconter de manière exhaustive. Parlons de la reliure à partir de l’expérience de l’auteur.

La façon la plus courante de l'utiliser est que son élément cible est l'objet DataContext sur le contrôle. Comme suit :

 <TextBlock Grid.Column="0" Text="{Binding DishName}" Style="{StaticResource TakingDishDishNameTextStyle}" />
Copier après la connexion

L'attribut DataContext se trouve sur la classe FrameworkElement. En d’autres termes, la plupart des contrôles auront leur propre DataContext. Ensuite, nous définissons généralement la propriété DataContext uniquement sur la couche la plus externe. Afin de comprendre plus clairement la liaison DataContext. L'auteur a donné un exemple simple. L'auteur définit la valeur DataContext pour la fenêtre la plus externe. Dans le même temps, la valeur DataContext est également définie pour sa grille interne. Mais il ne s’agit pas du même type d’objet, ils ont simplement les mêmes attributs. Les

<Window x:Class="Wpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:aomi="http://aomiwpf.com/ModernUI"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local ="clr-namespace:Wpf"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:WindDataContext /></Window.DataContext><Grid><Grid.DataContext><local:GridDataContext /></Grid.DataContext><TextBlock Text="{Binding  TestName}"></TextBlock></Grid></Window>
Copier après la connexion

résultats d'exécution suivants :

L'expérience peut prouver que l'élément cible de la méthode de liaison standard est DataContext . Il trouvera le DataContext le plus proche de l'élément actuellement lié. Faisons une hypothèse : à quoi cela ressemblerait-il si la propriété TestName dans la classe GridDataContext était remplacée par TestName1 ? Voici le résultat de l'exécution de

 1 public class GridDataContext : NotifyPropertyChanged 2     { 3         private string _testName1 ="GridDataContext"; 4  5         public string TestName1 6         { 7             set 8             { 9 10                 if (this._testName1 != value)11                 {12                     this._testName1 = value;13                     OnPropertyChanged("TestName1");14                 }15             }16             get { return this._testName1; }17         }18     }
Copier après la connexion

 :

Désolé ! L'auteur a pensé qu'il irait à la propriété TestName du DataContext de Windows. Apparemment, non. Cela explique également qu'il recherchera uniquement dans le DataContext le plus proche. Je n'irai pas directement les chercher un par un.

Il convient de noter que si vous écrivez simplement {Binding} ci-dessus, cela liera le DataContext actuel. plutôt que ses attributs.

Lors du processus de développement, nous espérons souvent qu'un élément puisse être lié à un attribut sur un autre élément. Tant que l'attribut d'un autre élément change, un élément sera notifié pour changer ensemble. À ce stade, vous devez utiliser la méthode suivante.

{Binding ElementName=SomeThingName, Path=Text}
Copier après la connexion

ElementName : représente le nom de l'élément.

Chemin : représente les attributs de l'objet élément.

En fait on peut penser à un problème. La liaison n’affecte-t-elle qu’une seule partie ? C'est le mode utilisé dans la liaison. Comme suit

{Binding ElementName=SomeThindName, Path=Text,Mode=TwoWay}
Copier après la connexion

TwoWay : entraîne les modifications de l'attribut source ou de l'attribut cible pour mettre automatiquement à jour l'autre.

OneWay : lorsque la source de liaison (source) change, mettez à jour la propriété cible de liaison (target).

OneTime : mettez à jour la cible de liaison lorsque l'application démarre ou que le contexte des données change.

OneWayToSource : met à jour la propriété source lorsque la propriété cible change.

L'utilisation ci-dessus est relativement courante. C'est aussi relativement simple. Pourquoi ne pas jeter un œil à une expression contraignante dans un projet open source. Comme suit

<Button Command="{Binding Source={x:Static SystemCommands.MinimizeWindowCommand}}" ToolTip="{x:Static modernui:Resources.Minimize}" Style="{StaticResource SystemButton}">
   <Button.Content>  <Grid Width="13" Height="12" RenderTransform="1,0,0,1,0,1"> <Path Data="M0,6 L8,6 Z" Width="8" Height="7" VerticalAlignment="Center" HorizontalAlignment="Center"  Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="2"  />  </Grid>
  </Button.Content></Button>
Copier après la connexion

Je ne sais pas si vous pouvez le voir clairement. Ce qui précède signifie que le premier plan du bouton du nœud parent et le trait du chemin actuel sont liés ensemble. La clé principale est AncestorType. Utilisé pour préciser le type de père. Mode est un type RelativeSourceMode. Il a quatre valeurs. comme suit.

PreviousData : utilisé pour les listes de données, c'est-à-dire les éléments de données précédents. C'est l'affichage au-dessus de la collecte de données. Commandes non incluses.

TemplatedParent : utilisé pour la liaison sur des modèles.

Self : se lie aux attributs de l'élément lui-même.

FindAncestor : utilisé pour rechercher des éléments parents.

Tant que cela est expliqué de cette manière, vous pouvez comprendre que RelativeSource est utilisé pour spécifier des éléments source relatifs. C'est l'élément cible.

En fait, il existe une autre manière possible d’écrire l’expression ci-dessus. Autrement dit, il existe une profondeur supplémentaire (AncestorLevel) utilisée pour limiter le parent. Comme suit

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=Name}
Copier après la connexion

Remarque : Si vous souhaitez modifier la valeur liée, vous devez utiliser un convertisseur. Comme suit

{Binding ElementName=SomeThindName, Path=Text,Mode=TwoWay,Converter=XXXConverter}
Copier après la connexion

Lors du développement de contrôles personnalisés, nous utilisons souvent une expression. Comme suit

  Width="{TemplateBinding Width}"
Copier après la connexion

L'écriture ci-dessus n'est qu'une abréviation. La liste complète est la suivante

 Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}"
Copier après la connexion

On peut dire que le contenu ci-dessus est ce que j'utilise le plus fréquemment. Examinons ensuite quelques autres points de contenu contraignants. C'est-à-dire un contenu qui n'est pas courant.

1.Fonction StringFormat. Équivalent à la fonction string.format. Donnez un exemple. Si nous voulons ajouter "¥" devant le montant, nous pouvons l'utiliser. Comme suit

 <TextBlock Text="{Binding MoneyText, StringFormat=¥{0}}" />
Copier après la connexion

如果不是这样子做的话,你就不得不给“¥”一个TextBlock来显示,或是MoneyText变成string类型,然后设置值里面加上¥。但是笔者这里却是double类型的。所以用StringFormat的功能有就可以完美的决解了显示“¥”的问题。

执行结果:

2.TargetNullValue的功能,用于绑定目标是一个null值的时候,要显示的内容。如下笔者给NullName赋null。

 <TextBlock Text="{Binding NullName, TargetNullValue=aomi}" />
Copier après la connexion

执行结果:

3.FallbackValue的功能,用于绑定目标是发生错误的时候,要显示的内容。如下

<TextBlock Text="{Binding NullName, FallbackValue=aomi}" />
Copier après la connexion

执行结果笔者就不贴了。

文章最后。在来说明一个不常用的功能——PriorityBinding。这个功能笔者不好说。只能让读者们自行体会吧。他主要用于在加载时间比较多的时候,要显示的信息。比如显示“正在加载中...”。笔者做了例子吧。

Xaml:

<Window x:Class="Wpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:aomi="http://aomiwpf.com/ModernUI"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local ="clr-namespace:Wpf"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:MainViewModel /></Window.DataContext><Grid><TextBlock><TextBlock.Text><PriorityBinding><Binding Path="UserName" IsAsync="True"></Binding><Binding Path="LoadingName"></Binding></PriorityBinding></TextBlock.Text></TextBlock></Grid></Window>
Copier après la connexion

ViewModel:

 public class MainViewModel : NotifyPropertyChanged
    {private string _userName ="Haya";private string _loadingName = "正在加载中...";public string UserName
        {set{if (this._userName != value)
                {this._userName = value;
                    OnPropertyChanged("UserName");
                }
            }get {
                Thread.Sleep(7000);return this._userName;
            }
        }public string LoadingName
        {set{if (this._loadingName != value)
                {this._loadingName = value;
                    OnPropertyChanged("LoadingName");
                }
            }get { return this._loadingName; }
        }
    }
Copier après la connexion

执行结果:

七秒后:

本章的内容比较简单。笔者只是讲述了常用的一些知识点。但是必不是说就这些了。例如Binding还关系到Xml的绑定和集合的绑定功能。读者们可以自行去找一下资料。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal