Как привязать открытое свойство к свойству WPF TextBox.Text - PullRequest
1 голос
/ 13 марта 2011

Я изо всех сил пытался связать TextBox.Text с публичной собственностью какого-либо объекта, но, к сожалению, я еще не совсем там.

Фактический XAML выглядит так:

<Window 
    <!-- skipped --> 
    xmlns:local="clr-namespace:Dotnet.Samples.Foobar"
    xmlns:system="clr-namespace:System;assembly=mscorlib">

    <Window.Resources>
        <local:Foobar x:Key="foobar" Foo="Lorem" Bar="Ipsum"
    </Window.Resources>
    <!-- skipped -->

        <TextBox Text="{Binding Source={StaticResource foobar}, Path=Foo}">
        <TextBox Text="{Binding Source={StaticResource foobar}, Path=Bar}">
        <!-- skipped -->
</Window>

С объектом поставщика данных так же просто, как:

public class Foobar
{
    public string Foo { get; set; }
    public string Bar { get; set; }

    public Foobar()
    {

    }
}

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

РЕДАКТИРОВАТЬ - Все привязки работают нормально, остальная проблема заключается в уведомлении об изменениях из модели в ViewModel (работает наоборот). Я передал «сломанный» код альтернативному репо: http://nanotaboada.svn.beanstalkapp.com/dotnet/trunk/Dotnet.Samples.Rijndael/

Не стесняйтесь оформить заказ, и я был бы очень рад услышать о любых отзывах по этому поводу. Большое спасибо заранее

Ответы [ 4 ]

1 голос
/ 13 марта 2011

Механизм привязки XAML не находит подходящий конструктор для использования, даже если параметры вашего метода конструктора являются необязательными. Следовательно, вам нужно либо передать значения для конструктора, либо создать конструктор без параметров, который устанавливает значение Foo в значение по умолчанию, либо вообще не использовать ObjectDataProvider, а также создать экземпляр вашего типа напрямую. как ресурс.

...
xmlns:system="clr-namespace:System;assembly=mscorlib"
...

<!-- Either create an instance of your type, and you can initialise the property values, this will require a default parameterless constructor -->
<abc:Foobar x:Key="foobar2" Foo="Foo" />

<!-- or pass the optional parameter values into your existing constructor -->
<ObjectDataProvider x:Key="foobar" ObjectType="{x:Type abc:Foobar}">
  <ObjectDataProvider.ConstructorParameters>
    <system:String>Foo</system:String>
    <system:String>Bar</system:String>
  </ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

Обратите внимание, что вам нужно будет реализовать INotifyPropertyChanged, только если ваши привязки будут недействительными в коде, и вам необходимо уведомить пользовательский интерфейс. Если вы недовольны реализацией этого интерфейса на типах моделей, вы можете сделать это на моделях представлений (при условии, что вы используете MVVM), но тогда вам нужно будет найти другой механизм для уведомления моделей представлений, когда ваша модель значения меняются.

1 голос
/ 13 марта 2011

Что вы подразумеваете под "не совсем там"?Все выглядит хорошо для меня, за исключением того, что вы пропустили уведомление об изменении в вашем классе Foobar.Измените его так, чтобы оно правильно реализовывало INotifyPropertyChanged, и все должно работать нормально.

1 голос
/ 13 марта 2011

Я думаю, что это проблема с параметрами в конструкторе.Если они вам действительно нужны, вы можете написать это так:

<ObjectDataProvider x:Key="foobar" ObjectType="{x:Type abc:Foobar}" MethodName="Foobar1">
        <ObjectDataProvider.MethodParameters>
            <sys:String>my_param</sys:String>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

Что также потребует добавления: xmlns:sys="clr-namespace:System;assembly=mscorlib"

И тогда класс Foobar будет таким:

public class Foobar
{
    public string Foo { get; set; }
    public string Bar { get; set; }

    public Foobar Foobar1(string param1 = "foo", string param2 = "bar")
    {
        Foobar f = new Foobar();
        f.Foo = param1;
        f.Bar = param2;
        return f;
    }
}

Избавьтесь от / добавьте параметры в XAML по мере необходимости.

1 голос
/ 13 марта 2011

Это выглядит хорошо, за исключением того, что я не думаю, что ObjectDataProvider способен читать параметры по умолчанию. Попробуйте создать конструктор Foobar, который не имеет аргументов.

В противном случае, вы можете дать нам ошибку, которую видите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...