【问题标题】:Hello, I need to set depedency property changing listener你好,我需要设置依赖属性更改监听器
【发布时间】:2019-03-10 07:53:55
【问题描述】:

我有一个用户控件:

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 时,我没有错误。我做错了什么? 我的程序中有一个低级键挂钩,但我认为它们不会导致错误。

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

【问题讨论】:

    标签: wpf data-binding user-controls


    【解决方案1】:

    欢迎使用 stackoverflow。 InvalidOperationException 被抛出,因为您在属性更改处理程序中执行 MessageBox.Show(..)。这个例外的原因并不容易解释。它与可重入性和 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);
        }
    

    【讨论】:

    • 非常感谢,如果没有您的帮助,我确定我永远不会弄明白
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2015-09-08
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多