您好,我需要设置监听属性更改监听器

时间:2019-03-10 07:53:56

标签: wpf data-binding user-controls

我有一个用户控件:

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-调度程序处理已被内部InvalidOperationException暂停-相同的描述。但是,当我从DependencyProperty中删除OnPropertyChangesListener时,我没有任何错误。我做错了什么? 我的程序中有一个低级的键挂钩,但是我不认为它们会导致错误。

此外,我想知道如何绑定集合中的元素,因为现在我将绑定具有目标对象属性的自定义类对象。

1 个答案:

答案 0 :(得分:0)

欢迎使用stackoverflow。 因为在属性更改的处理程序中执行MessageBox.Show(..),所以引发InvalidOperationException。产生此异常的原因并不那么容易解释。它与重入和wpf消息循环有关。有关更多详细信息,请查看this question的答案。

简而言之:您应该避免在(User)Control代码中调用MessageBox.Show(..)。如果仍然需要,可以通过告诉调度程序在布局和更改可视树完成后显示消息框,来解决该问题:

    private static void OnDialogInfoPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Application.Current.Dispatcher.BeginInvoke(new Action(() => {
            MessageBox.Show("Hello");
        }), DispatcherPriority.ApplicationIdle);
    }