如何将公共属性绑定到WPF TextBox.Text属性

时间:2011-03-13 15:47:43

标签: c# wpf c#-4.0 binding

我一直在努力将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 个答案:

答案 0 :(得分:1)

这看起来很好,但我不认为ObjectDataProvider能够读取默认参数。尝试创建一个没有任何参数的Foobar构造函数。

如果做不到,你能告诉我们你看到的错误吗?

答案 1 :(得分:1)

“不完全在那里”是什么意思?除了您在Foobar课程中缺少更改通知外,一切看起来都不错。更改它以便它正确实现INotifyPropertyChanged并且一切都应该正常工作。

答案 2 :(得分:1)

我认为构造函数中的参数存在问题。如果你真的需要它们,可以这样写:

<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中删除/添加参数。

答案 3 :(得分:1)

即使构造函数方法参数是可选的,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,并且您需要通知UI。如果您不满意在模型类型上实现此接口,那么您可以在视图模型上执行此操作(假设您使用的是MVVM),但是当您的模型需要时,您需要找到另一种机制来通知您的视图模型价值观发生了变化。