如何将数据绑定到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)
我的建议是修改,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成员可能是一个很好的简单开始.