Data binding F#:使用INotifyPropertyChanged进行数据绑定

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

如何实现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.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自动将事件作为绑定的一部分挂钩。