Data binding F#:使用INotifyPropertyChanged进行数据绑定
如何实现INotifyPropertyChanged以用于F#类型?Data binding F#:使用INotifyPropertyChanged进行数据绑定,data-binding,f#,inotifypropertychanged,Data Binding,F#,Inotifypropertychanged,如何实现INotifyPropertyChanged以用于F#类型? 谢谢 它与任何其他语言基本相同: open System.ComponentModel type MyType() = let ev = new Event<_,_>() let mutable str = "" member x.StringProp with get() = str and set(str') = str <- str' ev.Tr
谢谢 它与任何其他语言基本相同:
open System.ComponentModel
type MyType() =
let ev = new Event<_,_>()
let mutable str = ""
member x.StringProp
with get() = str
and set(str') =
str <- str'
ev.Trigger(x, PropertyChangedEventArgs("StringProp"))
interface INotifyPropertyChanged with
[<CLIEvent>]
member x.PropertyChanged = ev.Publish
opensystem.ComponentModel
类型MyType()=
设ev=新事件()
让可变str=“”
成员x.StringProp
使用get()=str
和集合(str')=
str
实际上
您可以使用fody proeprty changed自动实现它
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
那么你可以这样使用它
type ViewModelTest() =
inherit ViewModelBase()
/// two way binding
member val Hello = 6 with get, set
/// one way binding
member x.Yes = x.Hello + 1
生成的反编译代码如下所示:
using System;
using Microsoft.FSharp.Core;
namespace Shrimp.UI.Forms.FSharp
{
// Token: 0x02000002 RID: 2
[CompilationMapping(3)]
[Serializable]
public class ViewModelTest : ViewModelBase
{
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
public ViewModelTest() : this()
{
this.Hello@ = 6;
}
// Token: 0x17000001 RID: 1
// (get) Token: 0x06000002 RID: 2 RVA: 0x00002061 File Offset: 0x00000261
// (set) Token: 0x06000003 RID: 3 RVA: 0x0000206C File Offset: 0x0000026C
public int Hello
{
get
{
return this.Hello@;
}
set
{
if (this.Hello@ == value)
{
return;
}
this.Hello@ = value;
this.<>OnPropertyChanged(<>PropertyChangedEventArgs.Yes);
this.<>OnPropertyChanged(<>PropertyChangedEventArgs.Hello);
}
}
// Token: 0x17000002 RID: 2
// (get) Token: 0x06000004 RID: 4 RVA: 0x000020A4 File Offset: 0x000002A4
public int Yes
{
get
{
return this.Hello + 1;
}
}
// Token: 0x04000001 RID: 1
internal int Hello@;
}
}
使用系统;
使用Microsoft.FSharp.Core;
命名空间Shrimp.UI.Forms.FSharp
{
//令牌:0x020000002 RID:2
[汇编制图(3)]
[可序列化]
公共类ViewModelTest:ViewModelBase
{
//令牌:0x06000001 RID:1 RVA:0x000002050文件偏移量:0x00000250
public ViewModelTest():this()
{
这个,你好,6,;
}
//令牌:0x17000001 RID:1
//(获取)令牌:0x06000002 RID:2 RVA:0x00002061文件偏移量:0x00000261
//(设置)令牌:0x06000003 RID:3 RVA:0x0000206C文件偏移量:0x0000026C
公共int你好
{
得到
{
还我这个,你好,;
}
设置
{
if(this.Hello@==值)
{
返回;
}
这个.Hello@=值;
this.OnPropertyChanged(PropertyChangedEventArgs.Yes);
this.OnPropertyChanged(PropertyChangedEventArgs.Hello);
}
}
//令牌:0x17000002 RID:2
//(获取)令牌:0x06000004 RID:4 RVA:0x000020A4文件偏移量:0x000002A4
公共int是
{
得到
{
归还这个。你好+1;
}
}
//令牌:0x04000001 RID:1
内部int Hello@;
}
}
这与其他语言“基本上不一样”:PThanks,[]属性的作用到底是什么?我似乎找不到任何关于它的文档。@RodYan-它影响事件所采用的编译形式;对于与其他.NET语言的互操作(以及实现暴露.NET事件的接口),您需要将其应用于IEvent值。这会导致生成add
和remove
方法,而不是实际公开类型为IEvent
的属性,如中所述。这是实现接口的一个非常好的示例,但没有说明如何通过数据绑定将其连接到WPF控件属性,例如,@ScottHutchinson WPF自动将事件作为绑定的一部分挂钩。