我如何知道何时评估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.Show,它似乎导致XAML绑定源进行评估。
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
将在渲染时对其进行评估。由于MessageBox.Show()导致UI线程被泵送,因此将在显示消息框之前对其进行评估。
尝试连接到WPF窗口的Loaded方法并运行你需要做的事情。
编辑:根据http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx,加载的事件应在数据绑定后运行。如果不这样做,我会建议使用Dispatcher将您的代码排队以使用Invoke在UI线程上运行