关键词:
【中文标题】数据绑定到 WPF 中的方法【英文标题】:Databinding to a method in WPF 【发布时间】:2010-02-21 07:37:06 【问题描述】:我在将TextBox.Text
属性数据绑定到对象的方法时遇到问题。这个想法是允许用户在TextBox
中写入一个文件名,然后让TextBlock
输出该文件的扩展名。
class GetFileInfo
public string GetFileExtension(string fileName)
return Path.GetExtension(fileName);
这是我的 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>
由于某种原因,它什么也没做。 Anyknow可以指出可能是什么原因? 这是我在设计器和运行应用程序时看到的:
当我尝试在运行时设置其他文本时会发生以下情况:
这是调试器在运行时尝试设置其他文本时给出的错误:
System.Windows.Data 错误:8:无法将值从目标保存回源。 BindingExpression:Path=MethodParameters[0]; DataItem='ObjectDataProvider' (HashCode=2207369);目标元素是'TextBox'(名称='textBox1');目标属性是“文本”(“字符串”类型)ArgumentException:“System.ArgumentException:“MS.Internal.Data.PropertyPathWorker+IListIndexerArg”类型的对象无法转换为“System.Int32”类型。 在 System.RuntimeType.TryChangeType(对象值,活页夹活页夹,CultureInfo 文化,布尔需求SpecialCast) 在 System.RuntimeType.CheckValue(对象值、Binder 活页夹、CultureInfo 文化、BindingFlags invokeAttr) 在 System.Reflection.MethodBase.CheckArguments(Object[] 参数,Binding 活页夹,BindingFlags invokeAttr,CultureInfo 文化,签名 sig) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化,布尔型 skipVisibilityChecks) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 System.Reflection.RuntimePropertyInfo.SetValue(对象 obj,对象值,BindingFlags invokeAttr,活页夹活页夹,对象 [] 索引,CultureInfo 文化) 在 MS.Internal.Data.PropertyPathWorker.SetValue(对象项,对象值) 在 MS.Internal.Data.ClrBindingWorker.UpdateValue(对象值) 在 System.Windows.Data.BindingExpression.UpdateSource(对象值)'
【问题讨论】:
您必须将想法从绑定方法更改为属性。并学习 INotifyPropertyChanged & DataContext 的概念。谷歌也有一些 MVVM 模式。 +1 提出了一个可以帮助很多不了解数据绑定的人的问题。 【参考方案1】:虽然可以使用Binding
调用方法并获取其返回值,但这并不简单。绑定到属性以及使用绑定和更改通知的组合来获得您正在寻找的结果要简单得多。
创建一个具有两个属性的类,Filename
和 Extension
。 Filename
只是一个读/写字符串属性。 Extension
是一个只读字符串属性,它的 getter 调用您尝试调用的方法。
现在让那个类实现INotifyPropertyChanged
,因为如果一个属性可以在代码中改变,它需要一种方法来告诉绑定它已经这样做了。使Filename
属性的设置器通知绑定Extension
属性已更改。
将Binding
添加到使用TwoWay
模式绑定到Filename
属性的TextBox
。使用默认的OneWay
模式将Binding
添加到绑定到Extension
的TextBox
。
事件的顺序是:
-
用户在绑定的
TextBox
中键入新的Filename
,然后按TAB。
TextBox
失去焦点。
因为Binding
的模式是TwoWay
,并且它使用在目标失去焦点时更新源的默认行为,所以它就是这样做的。
Binding
通过调用 Filename
设置器更新源。
Filename
设置器引发 PropertyChanged
。
Binding
处理 PropertyChanged
,查看其参数,发现 Extension
属性已更改。
Binding
调用 Extension
属性的 getter。
Extension
属性的 getter 调用方法来确定Filename
的扩展名,并将其返回给Binding
。
Binding
将其目标 TextBox
更新为 Extension
的新值。
这是数据绑定和 MVVM 模式的核心概念。一旦你理解了它,它就变成了第二天性,WPF 开发变得容易了大约千万倍。
【讨论】:
我正在使用 Sam 的 24 小时自学 WPF 电子书,到目前为止,我已经学到了很多东西,而且我在第 6 章(数据绑定章节)上学习了迄今为止学习 WPF 的最简单方法之一。我花了几个小时在网上寻找资源,这本书是迄今为止我为 WPF 初学者找到的最好的书。 :)【参考方案2】:看来你需要了解一下 MVVM ,看看这篇经典文章 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
【讨论】:
是的,但正如我在帖子中指出的那样,我们的想法是在运行时在文本框中输入您想要的内容。我知道它正在使用我在设计时在数据绑定需要在更新源时调用NotifyPropertyChanged
事件。在这种情况下,您需要将此函数调用包装在 get/set 中,如下所示:
public class FileWrapper: System.ComponentModel.INotifyPropertyChanged
private string m_filename;
public string FileExtension
get return GetFileExtension(FileName);
public string FileName
get return m_filename;
set m_filename = value; OnPropertyChanged("FileName"); OnPropertyChanged( "FileExtension");
public string GetFileExtension( string filename)
//implementation
public event System.ComponentModel.NotifyPropertyChangedEvent PropertyChanged = (a,b)=>;
protected void OnPropertyChanged(string property)
PropertyChanged( this, new System.ComponentModel.PropertyChangedEventArgs( property ));
【讨论】:
我要试试这段代码。但是,给定一些参数,从给定的类中运行一些方法,难道没有更简单的解决方案吗? @devoured,如果您喜欢以正确的 WPF 方式进行操作,这应该是您需要使用的代码。上面的代码并没有什么疯狂的地方,如果你学会了这一点,它将永远帮助你使用 WPF。在任何基于 MVVM 的 WPF 中,您都可以看到这一小段代码 sn-p。所以值得学习。 但这应该放在哪里呢? FileExtension 应该是 Window 的属性吗?【参考方案4】:好的,这似乎是运行 WPF 4.0 时的一个错误,可以在 cmets here 中看到。
糟糕,我有点草率了.. 只要您为 3.5 框架(在 VS 2010 中)编译该示例,它就可以完美运行。 但是,如果您将其转换为 WPF 4.0 项目,则在编辑文本框时不再在 odp2 上调用 ObjectDataProvider 上的 WeightOnPlanet 方法。 我试图在 Binding 或 ObjectDataProvider 上找到任何新的属性——但到目前为止还没有任何结果……
在 3.5 中编译时,在这里可以正常工作。
【讨论】:
【参考方案5】:DataContext
设置了吗?在您的代码隐藏中,您是否将 TextBlock
的值设置为“saadsas”(我只能猜测),这破坏了您的数据绑定?
【讨论】:
我编辑了我的原始帖子。基本上我在代码文件中写的所有东西都在那里。我没有设置 DataContext。事实上,我现在正在谷歌搜索 DataContext 是什么。数据绑定到 WPF 中的 UserControl
】数据绑定到WPF中的UserControl【英文标题】:DatabindingtoaUserControlinWPF【发布时间】:2010-07-1614:07:28【问题描述】:我有一个想要参与数据绑定的UserControl。我已经在用户控件中设置了依赖属性,但无法正常工作。当我用静态文本(... 查看详情
将枚举属性数据绑定到 WPF 中的组合框
】将枚举属性数据绑定到WPF中的组合框【英文标题】:DatabindinganenumpropertytoaComboBoxinWPF【发布时间】:2010-09-0816:39:57【问题描述】:以如下代码为例:publicenumExampleEnumFooBar,BarFoopublicclassExampleClass:INotifyPropertyChangedprivateExampleEnumexamp... 查看详情
将枚举属性数据绑定到 WPF 中的组合框
】将枚举属性数据绑定到WPF中的组合框【英文标题】:DatabindinganenumpropertytoaComboBoxinWPF【发布时间】:2010-09-0816:39:57【问题描述】:以如下代码为例:publicenumExampleEnumFooBar,BarFoopublicclassExampleClass:INotifyPropertyChangedprivateExampleEnumexamp... 查看详情
wpf入门教程系列十八——wpf中的数据绑定
六、排序 如果想以特定的方式对数据进行排序,可以绑定到CollectionViewSource,而不是直接绑定到ObjectDataProvider。CollectionViewSource则会成为数据源,并充当截取ObjectDataProvider中的数据的媒介,并提供排序、分组和... 查看详情
DataGrid中的WPF绑定到DataContext
...ontext【发布时间】:2013-11-1620:52:21【问题描述】:我在将数据网格组合框ItemsSource映射到主数据上下文时遇到了一些问题。这是一些演示代码来显示问题。我的物品类publicclassMyDatapublicstringNameget;set;publicstringPriorityg 查看详情
WPF 数据验证中的绑定失败
】WPF数据验证中的绑定失败【英文标题】:FailedBindinginWPFDataValidation【发布时间】:2012-12-2213:32:54【问题描述】:我正在尝试将我的控件样式中的属性绑定到控件中定义的属性。该控件继承自TextBox,称为ChangeTextBoxWithRangeUnits。我... 查看详情
WPF 将列表绑定到 DataGrid 中的 ComboBoxColumn
...发布时间】:2021-03-1808:34:39【问题描述】:我遇到了WPF中数据网格中的组合框的问题。基本上我有一个“船员”类和“用户”类,在船员类中有一个列表,其中包含该船员的所有成员。理想情况下,我希望数据网格有3列“船员ID... 查看详情
如何将字符串列表数据绑定到 WPF/WP7 中的 ListBox?
】如何将字符串列表数据绑定到WPF/WP7中的ListBox?【英文标题】:HowcanIdatabindalistofstringstoaListBoxinWPF/WP7?【发布时间】:2012-03-1214:25:12【问题描述】:我正在尝试将字符串值列表绑定到列表框,以便逐行列出它们的值。现在我用这... 查看详情
数据绑定如何避免 WPF 中的递归更新?
】数据绑定如何避免WPF中的递归更新?【英文标题】:HowdoesdatabindingavoidrecursiveupdateinWPF?【发布时间】:2011-02-2122:29:57【问题描述】:我正在研究WPF中的绑定,然后我有一个问题:假设依赖属性绑定到实现INotifyPropertyChanged接口的... 查看详情
如何将 TabControl 的项目绑定到 wpf 中的可观察集合?
...的最简单示例是什么?每个选项卡的内容都将具有唯一的数据,并且确实这些数据将具有自己绑定到项目组件的observab 查看详情
wpf中的数据绑定
WPF中的数据绑定绑定模式 通过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项... 查看详情
wpf中的数据绑定
WPF中的数据绑定绑定模式 通过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项... 查看详情
将 Wpf 的数据网格绑定到数据库
】将Wpf的数据网格绑定到数据库【英文标题】:bindingdatagridforWpftoaDB【发布时间】:2012-11-2100:34:00【问题描述】:我正在尝试将WPF的DataGrid绑定到MSSQL数据库中的表。1)首先我创建了一个App.config文件如下rrr<connectionStrings><ad... 查看详情
使用 TemplateColumns 将 WPF DataGrid 绑定到 DataTable
...人能给我带来欢呼的时刻。我根本无法通过绑定成功拉取数据网格中的数据。我有一个包含多个MyDataType列的DataTablepubl 查看详情
Xml 数据到 WPF TreeView 的双向绑定
】Xml数据到WPFTreeView的双向绑定【英文标题】:Two-waybindingofXmldatatotheWPFTreeView【发布时间】:2010-09-1607:46:53【问题描述】:我正在尝试使用WPF作为表示层重写我的ForestPad应用程序。在WinForms中,我以编程方式填充每个节点,但如... 查看详情
WPF 将 TextBlock 绑定到自己 ViewModel 中的特定列表项
...HomeView.xaml是一个用户控件,显示在主窗口上。我在所有数据所在 查看详情
强制数据绑定 WPF ListBox 更新的更好方法?
】强制数据绑定WPFListBox更新的更好方法?【英文标题】:AbetterwayofforcingdataboundWPFListBoxtoupdate?【发布时间】:2010-09-2003:54:51【问题描述】:我有绑定到ObservableCollection的WPFListBox,当集合发生变化时,所有项目都会更新它们的位置... 查看详情
wpf入门教程系列十五——wpf中的数据绑定
...n(WPF)可以很方便的设计出强大的用户界面,同时WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在WPF中以通过后台代码绑定、前台XAML中进行绑定,或者两者组合的方式进行数据绑定... 查看详情