Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion über Bindungsausdrücke in WPF

Eine kurze Diskussion über Bindungsausdrücke in WPF

零下一度
零下一度Original
2017-06-24 09:55:544020Durchsuche

Ob es sich um die Definition eines Steuerelements oder eines Benutzersteuerelements handelt, es wird eine Funktion verwendet – Bindung. Der geschriebene Name: Elementbindung. Dies bedeutet, dass die gebundenen Elemente eine Datensynchronisation erreichen können. Nach Meinung des Autors ist die Einführung dieser Funktion in WPF wirklich perfekt. Die Programmierung ist konkreter. Besonders in Kombination mit dem MVVM-Modell ist es perfekt. Der Autor ist kein Akademiker. Es wäre unrealistisch, es umfassend zu erzählen. Lassen Sie uns aus der Erfahrung des Autors über Binding sprechen.

Die häufigste Verwendung besteht darin, dass das Zielelement das DataContext-Objekt im Steuerelement ist. Wie folgt:

 <TextBlock Grid.Column="0" Text="{Binding DishName}" Style="{StaticResource TakingDishDishNameTextStyle}" />

Das DataContext-Attribut befindet sich in der FrameworkElement-Klasse. Mit anderen Worten: Die meisten Steuerelemente verfügen über einen eigenen DataContext. Dann legen wir die DataContext-Eigenschaft im Allgemeinen nur auf der äußersten Ebene fest. Um die DataContext-Bindung besser zu verstehen. Der Autor hat ein einfaches Beispiel gemacht. Der Autor legt den DataContext-Wert für das äußerste Fenster fest. Gleichzeitig wird auch der DataContext-Wert für sein internes Grid festgelegt. Sie sind jedoch nicht vom gleichen Objekttyp, sondern haben nur die gleichen Attribute. Die folgenden

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

Ausführungsergebnisse:

Das Experiment kann beweisen, dass das Zielelement der Standardbindungsmethode DataContext ist . Es wird der DataContext gefunden, der dem aktuell gebundenen Element am nächsten liegt. Lassen Sie uns eine Hypothese aufstellen: Wie würde es aussehen, wenn die Eigenschaft TestName in der GridDataContext-Klasse durch TestName1 ersetzt würde? Das Folgende ist das Ausführungsergebnis von

 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     }

:

Entschuldigung! Der Autor dachte, er würde zur Eigenschaft TestName des DataContext von Windows gehen. Anscheinend tut er das nicht. Es erklärt auch, dass er nur im nächstgelegenen DataContext suchen wird. Ich werde nicht direkt nach oben gehen, um sie einzeln zu finden.

Es ist erwähnenswert, dass, wenn Sie oben einfach {Binding} schreiben, der aktuelle DataContext gebunden wird. und nicht seine Eigenschaften.

Während des Entwicklungsprozesses hoffen wir oft, dass ein Element an ein Attribut eines anderen Elements gebunden werden kann. Solange sich das Attribut eines anderen Elements ändert, wird ein Element benachrichtigt, sich gemeinsam zu ändern. Zu diesem Zeitpunkt müssen Sie die folgende Methode verwenden.

{Binding ElementName=SomeThingName, Path=Text}

ElementName: Stellt den Namen des Elements dar.

Pfad: Stellt die Attribute des Elementobjekts dar.

Tatsächlich können wir uns ein Problem vorstellen. Betrifft die Bindung nur eine Partei? Dies ist der beim Binden verwendete Modus. Wie folgt

{Binding ElementName=SomeThindName, Path=Text,Mode=TwoWay}

TwoWay: Bewirkt, dass Änderungen am Quellattribut oder Zielattribut automatisch das andere aktualisieren.

OneWay: Wenn sich die Bindungsquelle (Quelle) ändert, aktualisieren Sie die Eigenschaft des Bindungsziels (Ziel).

OneTime: Aktualisieren Sie das Bindungsziel, wenn die Anwendung startet oder sich der Datenkontext ändert.

OneWayToSource: Aktualisiert die Quelleigenschaft, wenn sich die Zieleigenschaft ändert.

Die oben genannte Verwendung ist relativ häufig. Es ist auch relativ einfach. Werfen wir einen Blick auf einen verbindlichen Ausdruck in einem Open-Source-Projekt. Wie folgt

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

Ich weiß nicht, ob Sie es deutlich sehen können. Das Obige bedeutet, dass der Vordergrund der Schaltfläche des übergeordneten Knotens und der Strich des aktuellen Pfads miteinander verbunden sind. Der Hauptschlüssel ist AncestorType. Wird verwendet, um die Art des Vaters anzugeben. Mode ist ein RelativeSourceMode-Typ. Er hat vier Werte. wie folgt.

PreviousData: wird für Datenlisten verwendet, also für frühere Datenelemente. Das ist die Anzeige oberhalb der Datensammlung. Steuerelemente nicht im Lieferumfang enthalten.

TemplatedParent: wird zum Binden an Vorlagen verwendet.

Selbst: An die Attribute des Elements selbst binden.

FindAncestor: wird verwendet, um übergeordnete Elemente zu finden.

Solange es auf diese Weise erklärt wird, können Sie verstehen, dass RelativeSource zur Angabe relativer Quellelemente verwendet wird. Das ist das Zielelement.

Tatsächlich gibt es eine andere Möglichkeit, den obigen Ausdruck zu schreiben. Das heißt, es gibt eine weitere Tiefe (AncestorLevel), die zur Begrenzung des übergeordneten Elements verwendet wird. Wie folgt:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=Name}

Hinweis: Wenn Sie den Grenzwert ändern möchten, müssen Sie einen Konverter verwenden. Wie folgt

{Binding ElementName=SomeThindName, Path=Text,Mode=TwoWay,Converter=XXXConverter}

Bei der Entwicklung benutzerdefinierter Steuerelemente verwenden wir häufig einen Ausdruck. Wie folgt

  Width="{TemplateBinding Width}"

Die obige Schreibweise ist nur eine Abkürzung. Die vollständige Liste lautet wie folgt:

 Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}"

Man kann sagen, dass der Autor den oben genannten Inhalt am häufigsten verwendet. Schauen wir uns als nächstes einige verbindliche andere Inhaltspunkte an. Das heißt, Inhalte, die nicht üblich sind.

1.StringFormat-Funktion. Entspricht der string.format-Funktion. Geben Sie ein Beispiel. Wenn wir vor dem Betrag „¥“ hinzufügen möchten, können wir es verwenden. Wie folgt

 <TextBlock Text="{Binding MoneyText, StringFormat=¥{0}}" />

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

执行结果:

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

 <TextBlock Text="{Binding NullName, TargetNullValue=aomi}" />

执行结果:

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

<TextBlock Text="{Binding NullName, FallbackValue=aomi}" />

执行结果笔者就不贴了。

文章最后。在来说明一个不常用的功能——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>

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

执行结果:

七秒后:

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

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über Bindungsausdrücke in WPF. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn