C# 何时对XAML绑定进行评估?

C# 何时对XAML绑定进行评估?,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,如何知道何时评估XAML绑定 -是否有一个方法/事件我可以挂钩 -有没有办法强制这些绑定进行计算 我有以下带有3个图像的XAML,每个图像都有各自的来源: <Window...> <Window.Resources> <local:ImageSourceConverter x:Key="ImageSourceConverter" /> </Window.Resources> <Grid> <Grid.ColumnD

如何知道何时评估XAML绑定

-是否有一个方法/事件我可以挂钩

-有没有办法强制这些绑定进行计算

我有以下带有3个图像的XAML,每个图像都有各自的来源:

<Window...>
<Window.Resources>
    <local:ImageSourceConverter x:Key="ImageSourceConverter" />
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Image x:Name="NonBindingImage" Grid.Column="0" Source="C:\Temp\logo.jpg" />
    <Image x:Name="XAMLBindingImage" Grid.Column="1" Source="{Binding Converter={StaticResource ImageSourceConverter}}" />
    <Image x:Name="CodeBehindBindingImage" Grid.Column="2" />
</Grid>
</Window>
这是窗口代码:

...
public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();

        Binding binding = new Binding { Source = CodeBehindBindingImage, Converter = new ImageSourceConverter() };
        BindingOperations.SetBinding(CodeBehindBindingImage, Image.SourceProperty, binding);

        object xamlImageSource = XAMLBindingImage.Source; // This object will be null
        object codeBehindImageSource = CodeBehindBindingImage.Source; // This object will have a value

        // This pause allows WPF to evaluate XAMLBindingImage.Source and set its value
        MessageBox.Show("");
        object xamlImageSource2 = XAMLBindingImage.Source; // This object will now mysteriously have a value
    }
}
...
当通过使用相同转换器的代码设置绑定时,它会立即计算

当通过XAML和转换器设置绑定时,它会将计算推迟到稍后的某个时间。我在代码中随机抛出了对MessageBox.Show的调用,它似乎导致XAML绑定源进行求值


有什么方法可以解决这个问题吗?

它将在渲染时进行评估。Show()会导致UI线程泵送,在显示MessageBox之前将对其进行评估

尝试挂接到WPF窗口的Loaded方法,并在那里运行您需要执行的操作


编辑:根据加载的事件,应在数据绑定后运行。如果不能做到这一点,我建议您使用Invoke将代码排队,以便在UI线程上运行,我认为您不需要“修复”它,因为它没有损坏。它在需要时而不是之前进行评估。我修改了该问题,使其不会引起争议,但如果A)将列索引1的宽度更改为自动,B)调用Measure/Arrange,XAMLBindingImage。源仍然为空。我的理解是,Measure/Arrange需要元素的大小才能正确布局(以及如何知道空源的am映像的大小)在窗口中,构造函数也不会加载图像源。我尝试过这样做:将代码放入已加载中仍然会为XAML中的绑定集生成空结果。我的困惑来自于为什么这两个绑定(代码和xaml)在求值时表现不同。谢谢,当您将线程的优先级设置为DispatcherPriority.Loaded时,调用Dispatcher.BeginInvoke是有效的。然而,这似乎仍然很奇怪,因为Measure()和Arrange()似乎清楚地表明它们将在上面的示例中评估基于转换器的绑定。向上投票给Dispatcher.BeginInvoke with DispatcherPriority.Loaded
...
public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();

        Binding binding = new Binding { Source = CodeBehindBindingImage, Converter = new ImageSourceConverter() };
        BindingOperations.SetBinding(CodeBehindBindingImage, Image.SourceProperty, binding);

        object xamlImageSource = XAMLBindingImage.Source; // This object will be null
        object codeBehindImageSource = CodeBehindBindingImage.Source; // This object will have a value

        // This pause allows WPF to evaluate XAMLBindingImage.Source and set its value
        MessageBox.Show("");
        object xamlImageSource2 = XAMLBindingImage.Source; // This object will now mysteriously have a value
    }
}
...