Очень простая проблема DependencyProperty в WPF - привязка для привязки к сложному объекту

Я только начинаю работать с WPF. У меня TextBox объявлен в xmal так:

<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=TestComplex.Something, Mode=TwoWay}"/>

В моем коде позади я зарегистрировал свойство, которое пытаюсь привязать следующим образом:

public TestComplexObject TestComplex
    {
        get { return (TestComplexObject)GetValue(TestComplexProperty); }
        set { SetValue(TestComplexProperty, value); }
    }

    public static readonly DependencyProperty TestComplexProperty=
        DependencyProperty.Register("TestComplex", typeof(TestComplexObject ), typeof(MainWindow), new UIPropertyMetadata(new TestComplexObject ()));

Класс TestComplexObject:

public class TestComplexObject : DependencyObject 
{
    public string Something
    {
        get { return (string)GetValue(SomethingProperty ); }
        set { SetValue(ExeLocationProperty, value); }
    }

    public static readonly DependencyProperty SomethingProperty =
        DependencyProperty.Register("Something", typeof(string), typeof(TestComplexObject), new UIPropertyMetadata("Test Text"));

}

Как видите, я пытаюсь привязать TextBox к TestComplex.Something, однако, когда я запускаю это, все, что я получаю, - это исключение синтаксического анализа xmal,

«'Вызов конструктора для типа' EmuRunner.MainWindow ', который соответствует указанным ограничениям привязки, вызвал исключение.' Номер строки "6" и позиция строки "9"

Я действительно понятия не имею, что я здесь делаю не так, может ли кто-нибудь помочь?

Заранее спасибо.


person bplus    schedule 03.10.2010    source источник
comment
Вы просматривали свойство исключения InnerException?   -  person Nir    schedule 04.10.2010


Ответы (2)


Я полагаю, вы обнаружите, что этот вопрос содержит ответ на вашу проблему.

По сути, ваш TestComplexObject не является свободным и потокобезопасным (например, производным от System.Windows.Freezable). Инициализаторы типов для двух типов (MainWindow и TestComplexObject) выполняются (или могут быть) одновременно в разных потоках, что может вызвать исключение между потоками (или хуже), когда инициализатор типа для MainWindow вызывает инициализатор типа для TestComplexObject. . Платформа обнаруживает этот потенциал и выдает исключение.

person Robert Rossney    schedule 04.10.2010
comment
Большое спасибо, я проверю, когда вернусь домой, но, похоже, это проблема. - person bplus; 04.10.2010

Проблема в этой строке:

set { SetValue(ExeLocationProperty, value); }

Вам разрешено вызывать SetValue(SomethingProperty, value); в сеттере только для Something.

person Femaref    schedule 03.10.2010
comment
Это не правда. Нет обязательной связи между именами свойств зависимостей и именами свойств CLR, в качестве которых они представлены. То, что свойство CLR Foo сопоставляется со свойством зависимостей FooProperty, является полностью условием. Фактически у вас может быть несколько свойств CLR, которые все устанавливают один и тот же DP. Ужасная, ужасная идея, но она не вызовет исключения. - person Robert Rossney; 04.10.2010