Здравствуйте, мне нужно установить свойство зависимостей, меняющее слушателя - PullRequest
0 голосов
/ 10 марта 2019

У меня есть пользовательский элемент управления:

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 - то же самое описание.Но когда я удаляю OnPropertyChangesListener из DependencyProperty, у меня нет ошибки.Что я сделал не так?У меня есть низкоуровневые зацепки в моей программе, но я не думаю, что они вызвали ошибку.

Кроме того, я хочу знать, как я могу связать элемент в коллекции, потому что теперь я связываю объект пользовательского класса со свойством целевого объекта.

1 Ответ

0 голосов
/ 10 марта 2019

добро пожаловать в stackoverflow.InvalidOperationException выбрасывается, потому что вы делаете MessageBox.Show (..) в обработчике изменения свойства.Причину этого исключения не так легко объяснить.Это связано с повторным входом и циклом сообщений wpf.Ознакомьтесь с ответом на этот вопрос для получения более подробной информации.

Вкратце: вам следует избегать вызова MessageBox.Show (..) в (пользовательском) контрольном коде.Если вам все еще нужно, вы можете обойти проблему, попросив диспетчера показать окно сообщения, когда все будет сделано с макетом и изменением визуального дерева:

    private static void OnDialogInfoPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Application.Current.Dispatcher.BeginInvoke(new Action(() => {
            MessageBox.Show("Hello");
        }), DispatcherPriority.ApplicationIdle);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...