我一直在努力将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/
随时结帐,我很高兴听到有关此事的任何反馈。非常感谢提前
答案 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),但是当您的模型需要时,您需要找到另一种机制来通知您的视图模型价值观发生了变化。