我有一个用户控件:
public partial class DialogControl : UserControl
{
public BaseDialogInfo DialogInfo
{
get { return (BaseDialogInfo)GetValue(BaseDialogProperty); }
set { SetValue(BaseDialogProperty, value); }
}
public static readonly DependencyProperty BaseDialogProperty=
DependencyProperty.Register("DialogInfo", typeof(BaseDialogInfo), typeof(DialogControl), new UIPropertyMetadata(new BaseDialogInfo("", "", 0), new PropertyChangedCallback(OnDialogInfoPropertyChanged)));
private static void OnDialogInfoPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("");
// Perform callback action.
}
public DialogControl()
{
InitializeComponent();
}
}
我有一个主窗口:
C#:
public class DialogInfoContainer {
public BaseDialogInfo info { get; set; }
}
public partial class MainWindow : Window
{
public ObservableCollection<DialogInfoContainer> pathes;
public MainWindow()
{
InitializeComponent();
pathes = new ObservableCollection<DialogInfoContainer>() { new DialogInfoContainer() { info = new BaseDialogInfo("", "", 0) } };
lb.ItemsSource = pathes;
}
}
XAML:
<Grid>
<ListBox x:Name="lb" Background="Transparent">
<ListBox.ItemTemplate>
<DataTemplate>
<local:DialogControl DialogInfo="{Binding Path=info}"></local:DialogControl>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
当我启动程序时,我得到System.Windows.Markup.XamlParseException - Dispatcher处理已被暂停,内部InvalidOperationException - 相同的描述。但是当我从DependencyProperty中删除OnPropertyChangesListener时,我没有错误。我做错了什么?我的程序中有一个低级别的挂钩,但我不认为它们会导致错误。
另外,我想知道如何在集合中绑定元素,因为现在我将自定义类对象与目标对象属性绑定。
欢迎来到stackoverflow。抛出InvalidOperationException是因为您在属性更改的处理程序中执行MessageBox.Show(..)。这种例外的原因并不容易解释。它与reentrancy和wpf消息循环有关。查看this question的答案以获取更多详细信息。
简而言之:您应该避免在(用户)控制代码中调用MessageBox.Show(..)。如果你仍然需要,你可以通过告诉调度员在完成布局和改变可视化树时显示消息框来解决问题:
private static void OnDialogInfoPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() => {
MessageBox.Show("Hello");
}), DispatcherPriority.ApplicationIdle);
}