2017-08-28 4 views
1

Wie oft wird die Bindungs-Engine beim folgenden MultiBinding-Ausdruck nach dem DataGrid-Vorfahren suchen, wenn PropB mehrfach geändert wird?WPF Multibinding RelativeSource Findancestor Evaluierungsleistung

Wird es nur einmal suchen, wenn das PropertyC (und der Pfad dazu) nie geändert wird? Oder wird es den Vorfahren immer dann suchen, wenn eine der Eigenschaften in der Multibinde geändert wird? Angenommen, es gibt Änderungsbenachrichtigungen für jede Eigenschaft.

Antwort

2

Der einzige Weg, den ich sehe, um dies zu testen, ist durch Entfernen der Kontrollen, um zu sehen, ob es die richtige Kontrolle findet.

Testen Sie es so, es sieht aus, als ob es nur einmal ausgewertet wird, ob MultiBinding oder nicht.

<Window x:Class="RelativeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel x:Name="Stack"> 
     <TextBlock x:Name="TB1" Text="Foo" /> 
     <TextBlock x:Name="TB2" Text="Bar" /> 

     <Border BorderThickness="1" BorderBrush="Black" /> 

     <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=StackPanel}, Path=Children[0].Text}" 
        Foreground="Red" /> 

     <TextBlock Foreground="Blue"> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{2}"> 
        <Binding ElementName="TB1" Path="Text" /> 
        <Binding ElementName="TB2" Path="Text" /> 
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=StackPanel}" Path="Children[0].Text" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
     <Button Click="ButtonBase_OnClick" Content="Remove 1st Child" /> 
    </StackPanel> 
</Window> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     Stack.Children.Remove(Stack.Children[0]); 
     TB1.Text = "You'll see me if I am looked up once."; 
     TB2.Text = "You'll see me twice if I am re-evaulated each time"; 
    } 
} 

Wenn es ursprünglich ausgeführt werden Sie sehen:

enter image description here

Wenn die Schaltfläche klicken, wird es das erste Kind entfernen und die Textblocks ändern neuen Text angezeigt werden, welches es nun binden, um anzuzeigen, zu.

enter image description here

+0

Vielen Dank, in der Tat ist es nur einmal bewertet! – Yoghurt

Verwandte Themen