如何将数据绑定到XAML中的union case值?

Sco*_*rod 3 wpf xaml f#

如何将数据绑定到XAML中的union case值?

目前,数据绑定值指向String20对象,而不是union情况(即String20)包含的实际字符串值.

例:

<ListView ItemsSource="{Binding Modules}" DisplayMemberPath="Author.First" />
Run Code Online (Sandbox Code Playgroud)

作者定义:

type Name = { 
    First:String20
    Last:String20
    Suffix:String20 option 
}

type Module = { 
    Author:Name
    Duration:Duration 
}
Run Code Online (Sandbox Code Playgroud)

XAML:

<Window x:Class="Client.MainWindow"
        ...
        xmlns:manageModules="clr-namespace:ManageModules;assembly=ManageModules">

    <Window.DataContext>
        <manageModules:CreationViewModel />
    </Window.DataContext>

    <Grid>
        <ListView ItemsSource="{Binding Modules}" DisplayMemberPath="Author.First" 
                  TextElement.Foreground="LightBlue" Background="Black" />
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

视图模型:

namespace ManageModules
    ...
    type CreationViewModel() =
        inherit ViewModelBase()
        let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
        let duration =  { Hours=1; Minutes=30; Seconds=0 }
        let moduleItem = { Author=name; Duration=duration }

        let mutable (_modules:Module ObservableCollection) = ObservableCollection()

        do _modules.Add(moduleItem)

        member this.Modules
            with get()      = _modules
            and set(value)  = _modules <- value

        member this.Add moduleItem = 
            _modules.Add(moduleItem)
Run Code Online (Sandbox Code Playgroud)

业务领域:

module ManageModule.Entities

type Duration = { 
    Hours:int
    Minutes:int
    Seconds:int 
}

type String20 = String20 of string

type Name = { 
    First:String20
    Last:String20
    Suffix:String20 option 
}

type Module = { 
    Author:Name
    Duration:Duration 
}

and Section = 
    | Introduction of Module
    | Conclusion of Module
    | Content of Module list
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 6

我的建议是修改,String20以便它包含一个普通string值的附加成员- 然后你可以绑定到普通string成员.

要将成员添加到类型,您可以编写:

type String20 = 
  | String20 of string
  member this.Value = 
    let (String20(str)) = this
    str
Run Code Online (Sandbox Code Playgroud)

然后你应该写:

<ListView ItemsSource="{Binding Modules}" DisplayMemberPath="Author.First.Value" />
Run Code Online (Sandbox Code Playgroud)

可能有更复杂的方法来解决这个问题 - 我猜WPF有一些机制来指定在幕后绑定中发生的转换 - 但添加Value成员可能是一个很好的简单开始.