2017-08-28 114 views
1

对于以下MultiBinding表达式,绑定引擎搜索DataGrid祖先IF如果PropB被多次更改多少次?WPF Multibinding RelativeSource Findancestor评估性能

<MultiBinding Converter="{StaticResource TestConverter}"> 
    <Binding Path="PropA"/> 
    <Binding Path="PropB" /> 
    <Binding Path="DataContext.Sub.PropertyC" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=DataGrid}" /> 
</MultiBinding> 

如果PropertyC(及其路径)永不改变,它只会搜索一次吗?或者每当多重绑定中的某个属性发生更改时,它是否会搜索祖先?假设每个属性都有更改通知。

回答

2

我看到有可能测试这种方法的唯一方法是通过实际删除控件以查看它是否找到适当的控件。

以这种方式进行测试,看起来好像仅使用MultiBinding来评估一次。

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

在最初运行它,你会看到:

enter image description here

当单击该按钮,它会删除第一个孩子,改变的TextBlocks显示新文本以表明哪一个,现在结合至。

enter image description here

+0

谢谢,其实它的评估只有一次! – Yoghurt