数据绑定到WPF中的方法

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)'

Rob*_*ney 7

虽然可以使用Binding调用方法并获取其返回值,但这并不简单.这是简单的绑定属性,并用结合和变更通知相结合,让你正在寻找的结果.

创建一个具有两个属性的类,FilenameExtension. Filename只是一个读/写字符串属性. Extension是一个只读字符串属性,其getter调用您尝试调用的方法.

现在制作该类实现INotifyPropertyChanged,因为如果一个属性可以在代码中改变,它需要一种告诉绑定它已经这样做的方法.使Filename属性的setter 通知绑定Extension属性已更改.

使用模式添加BindingTextBox绑定到Filename属性的a TwoWay.使用默认模式添加BindingTextBox绑定到的a .ExtensionOneWay

事件的顺序是:

  1. 用户Filename在绑定中键入new TextBox并按TAB键.
  2. TextBox失去焦点.
  3. 因为Binding's模式是TwoWay,并且当目标失去焦点时它正在使用更新源的默认行为,这就是它的作用.
  4. Binding更新源通过调用Filename制定者.
  5. Filename二传手提高PropertyChanged.
  6. Binding手柄PropertyChanged,看它的参数,并认为该Extension属性已经改变.
  7. Binding调用Extension属性的getter.
  8. Extension属性的getter调用来确定扩展的方法Filename,并将其返回Binding.
  9. Binding更新其目标TextBox与新的价值Extension.

这是基础数据绑定和MVVM模式的核心概念.一旦你理解了它,它就变成了第二天性,WPF开发变得容易了一千万倍.


dev*_*ium 0

好吧,这似乎是运行 WPF 4.0 时的一个错误,可以在此处的评论中看到。

\n\n
\n

哎呀,我有点仓促.. 只要您为 3.5 框架(在 VS 2010 中)编译它,该示例就可以完美运行。\n但是,如果您将其转换为 WPF 4.0 项目,则在 odp2 上不再调用 ObjectDataProvider 上的方法 WeightOnPlanet您编辑文本框。\n 我尝试在 Binding 或 ObjectDataProvider \xe2\x80\x93 上查找任何新属性,但到目前为止还没有任何结果 \xe2\x80\xa6

\n
\n\n

在3.5中编译时,这里工作正常。

\n