何时对XAML绑定进行评估

本文关键字:评估 绑定 XAML 何时 | 更新日期: 2023-09-27 18:10:59

我如何知道何时评估XAML绑定?

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

-是否有一种方法可以强制这些绑定进行评估?

我有以下XAML与3个图像,每个都有他们的来源一个单独的方式:

<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>
以下是XAML中引用的转换器:
public class ImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        BitmapImage image = new BitmapImage();
        image.BeginInit();
        image.StreamSource = new FileStream(@"C:'Temp'logo.jpg", FileMode.Open, FileAccess.Read);
        image.EndInit();
        return image;
    }

这里是窗口代码:

...
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打了个电话。在代码中显示,它似乎导致XAML绑定源计算。

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

何时对XAML绑定进行评估

将在渲染时评估。由于messagebox . show()导致UI线程泵送,它将在显示messagebox之前进行评估。

尝试连接到WPF窗口的Loaded方法,并在那里运行您需要做的事情。

Edit:根据http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx加载的事件应该在数据绑定后运行。如果做不到这一点,我建议使用Dispatcher将代码排队,以便使用Invoke

在UI线程上运行。