dev*_*ium 13 c# data-binding methods wpf
我无法将TextBox.Text属性数据绑定到对象的方法.这个想法是允许用户写TextBox一个文件名,然后TextBlock输出该文件的扩展名.
class GetFileInfo
{
public string GetFileExtension(string fileName)
{
return Path.GetExtension(fileName);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的XAML:
<Window.Resources>
<ObjectDataProvider x:Key="getFileInfo" MethodName="GetFileExtension" ObjectType="{x:Type local:GetFileInfo}">
<ObjectDataProvider.MethodParameters>
<sys:String>abc.text</sys:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel>
<TextBox Name="textBox1">
<TextBox.Text>
<Binding Source="{StaticResource getFileInfo}" Path="MethodParameters[0]" BindsDirectlyToSource="True" UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>
</TextBox>
<TextBlock Name="textBlock1" Text="{Binding Source={StaticResource getFileInfo}}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
出于某种原因,它没有做任何事情.任何可以指出可能是什么原因?这是我在设计师和运行应用程序时看到的内容:
替代文字http://img64.imageshack.us/img64/6922/f0rki14feo3oa3groxm5kgm.png
以下是我在运行时尝试设置其他文本时会发生的情况:
替代文字http://img684.imageshack.us/img684/1057/b52pnq1dm4i23qivizvpaqq.png 这是试图在运行时设置其他文本时去调试器给出的错误:
System.Windows.Data错误:8:无法将目标值保存到源.BindingExpression:路径= MethodParameters [0]; DataItem ='ObjectDataProvider'(HashCode = 2207369); target元素是'TextBox'(Name ='textBox1'); 目标属性是"文本"(类型"字符串")的ArgumentException:'System.ArgumentException:类型的对象'MS.Internal.Data.PropertyPathWorker + IListIndexerArg’不能被转换为类型'System.Int32’.在System.RuntimeType.TryChangeType(对象值,粘结剂粘结剂,CultureInfo的文化,布尔needsSpecialCast)在System.RuntimeType.CheckValue(对象值,粘结剂粘结剂,CultureInfo的文化,的BindingFlags invokeAttr)在System.Reflection.MethodBase.CheckArguments(对象[]参数,粘合剂粘合剂的BindingFlags invokeAttr,CultureInfo的文化,签名Sig)在System.Reflection.RuntimeMethodInfo.Invoke(对象OBJ,的BindingFlags invokeAttr,粘结剂粘结剂,对象[]参数,CultureInfo的文化,布尔skipVisibilityChecks)在System.Reflection.RuntimeMethodInfo.调用(对象OBJ,的BindingFlags invokeAttr,粘结剂粘结剂,对象[]参数,CultureInfo的培养)在System.Reflection.RuntimePropertyInfo.SetValue(对象OBJ,对象的值,的BindingFlags invokeAttr,粘结剂粘结剂,对象[]索引,CultureInfo的培养)在MS System.Windows.Data.BindingExpre上MS.Internal.Data.ClrBindingWorker.UpdateValue(Object value)的.Internal.Data.PropertyPathWorker.SetValue(Object item,Object value)ssion.UpdateSource(Object value)'
虽然可以使用Binding调用方法并获取其返回值,但这并不简单.这是多简单的绑定属性,并用结合和变更通知相结合,让你正在寻找的结果.
创建一个具有两个属性的类,Filename和Extension. Filename只是一个读/写字符串属性. Extension是一个只读字符串属性,其getter调用您尝试调用的方法.
现在制作该类实现INotifyPropertyChanged,因为如果一个属性可以在代码中改变,它需要一种告诉绑定它已经这样做的方法.使Filename属性的setter 通知绑定Extension属性已更改.
使用模式添加Binding到TextBox绑定到Filename属性的a TwoWay.使用默认模式添加Binding到TextBox绑定到的a .ExtensionOneWay
事件的顺序是:
Filename在绑定中键入new TextBox并按TAB键.TextBox失去焦点.Binding's模式是TwoWay,并且当目标失去焦点时它正在使用更新源的默认行为,这就是它的作用.Binding更新源通过调用Filename制定者.Filename二传手提高PropertyChanged.Binding手柄PropertyChanged,看它的参数,并认为该Extension属性已经改变.Binding调用Extension属性的getter.Extension属性的getter调用来确定扩展的方法Filename,并将其返回Binding.Binding更新其目标TextBox与新的价值Extension.这是基础数据绑定和MVVM模式的核心概念.一旦你理解了它,它就变成了第二天性,WPF开发变得容易了一千万倍.
| 归档时间: |
|
| 查看次数: |
17283 次 |
| 最近记录: |