【问题标题】:This expression was expected to have type string此表达式应为字符串类型
【发布时间】:2016-06-18 21:43:57
【问题描述】:

我正在尝试将 5 个文本框中的值合并到一个字符串中以显示在标签中。但是我收到此错误消息

This expression was expected to have type string but here has type string -> string -> string -> string -> string

我可以在标签中显示任何人的文本框值。 这是我使用的代码:

let temp = self.Factory.Backing(<@ self.Temp @>, "")
let ph = self.Factory.Backing(<@ self.PH @>, "")
let soil = self.Factory.Backing(<@ self.SOIL @>, "")
let slope = self.Factory.Backing(<@ self.SLOPE @>, "")
let aspect = self.Factory.Backing(<@ self.ASPECT @>, "")

let display = self.Factory.Backing(<@ self.Display @>, "")

let goCommand = self.Factory.CommandSyncParam(fun param -> self.Display <- sprintf "The data that has been enter is:\n%s,\n %s,\n %s,\n %s,\n %s" param)

member x.TEMP with get() = temp.Value and set value = temp.Value <- value
member x.PH with get() = ph.Value and set value = ph.Value <- value
member x.SOIL with get() = soil.Value and set value = soil.Value <- value
member x.SLOPE with get() = slope.Value and set value = slope.Value <- value
member x.ASPECT with get() = aspect.Value and set value = aspect.Value <-value
member x.Display with get() = display.Value and set value = display.Value <- value
member x.GoCommand = goCommand  

我找到了这个代码How do I concatenate a list of strings in F#?,这就是我想要的输出。所以我用我的价值观尝试了这段代码。

let strings =["temp.Value"; "ph.Value"; "soil.Value"]

let r = strings |> List.fold (fun r s -> r + s + "\n") ""

printfn "%s"

我得到了这个作为输出:

temp.Value
ph.Value
soil.Value

那么如何让每个类别的 Value 显示出来,以及如何将其合并到“let goCommand”中?

根据请求进行编辑以显示 xaml 代码

        <TextBox Grid.Row="3" Grid.Column="1" FontSize="14" Text="{Binding TEMP}"/>
    <TextBox Grid.Row="4" Grid.Column="1" FontSize="14" Text="{Binding PH}"/>
    <TextBox Grid.Row="5" Grid.Column="1" FontSize="14" Text="{Binding SOIL}"/>
    <TextBox Grid.Row="6" Grid.Column="1" FontSize="14" Text="{Binding SLOPE}"/>
    <TextBox Grid.Row="7" Grid.Column="1" FontSize="14" Text="{Binding ASPECT}" Grid.ColumnSpan="3" Margin="0,0,16,0" />
    <Button Margin="0,31,0,652" Grid.Row="8" FontSize="16" Content="Submit" Foreground="DarkBlue" FontWeight="Heavy" Background="LightBlue"
        Command="{Binding GoCommand}" CommandParameter="{Binding TEMP, PH, SOIL,SLOPE, ASPECT}"/>

【问题讨论】:

  • 如果您不需要从代码中更改要显示的变量(Temp、PH、SOIL、...),将它们组合成一条记录会更容易。
  • @FoggyFinder 添加了 xaml 代码。
  • 未来:xaml 不是 F# - 在绑定中使用 , 您不会创建这些元素的元组。

标签: wpf xaml data-binding f# string-concatenation


【解决方案1】:

您的属性 (x.TEMP,...) 可从 MainViewModel 获得 - 您无需尝试将它们的值作为参数传输。所以你需要使用不带任何参数的命令:

.xaml:

    <Button Margin="0,31,0,652" Grid.Row="8" FontSize="16"
     Content="Submit" Foreground="DarkBlue" FontWeight="Heavy" 
Background="LightBlue" Command="{Binding GoCommand}" />

.fs:

let display = self.Factory.Backing(<@ self.Display @>, "")

let go() = 
    self.Display <- sprintf "The data that has been enter is:\n%s,\n %s,\n %s,\n %s,\n %s" 
        self.TEMP self.PH self.SOIL self.SLOPE self.ASPECT

let goCommand = self.Factory.CommandSync(go)

编辑:

完整的.fs:

type MainViewModel() as self = 
    inherit ViewModelBase()    

    let temp = self.Factory.Backing(<@ self.TEMP @>, "")
    let ph = self.Factory.Backing(<@ self.PH @>, "")
    let soil = self.Factory.Backing(<@ self.SOIL @>, "")
    let slope = self.Factory.Backing(<@ self.SLOPE @>, "")
    let aspect = self.Factory.Backing(<@ self.ASPECT @>, "")

    let display = self.Factory.Backing(<@ self.Display @>, "")

    let go() = 
        self.Display <- sprintf "The data that has been enter is:\n%s,\n %s,\n %s,\n %s,\n %s" 
            self.TEMP self.PH self.SOIL self.SLOPE self.ASPECT

    let goCommand = self.Factory.CommandSync(go)

    member x.TEMP with get() = temp.Value and set value = temp.Value <- value
    member x.PH with get() = ph.Value and set value = ph.Value <- value
    member x.SOIL with get() = soil.Value and set value = soil.Value <- value
    member x.SLOPE with get() = slope.Value and set value = slope.Value <- value
    member x.ASPECT with get() = aspect.Value and set value = aspect.Value <-value
    member x.Display with get() = display.Value and set value = display.Value <- value
    member x.GoCommand = goCommand 

【讨论】:

  • 我收到以下错误:
    未定义字段、构造函数或成员“Display” --并且--- 绑定中出现意外标识符。在此点或其他标记处或之前预期不完整的结构化构造。--并且-- 不完整的值或函数定义。如果这是在表达式中,则表达式的主体必须缩进到与“let”关键字相同的列。
  • @Aaron M,我们可以继续聊天快速解决问题吗? chat.stackoverflow.com/rooms/51909/f
  • 我在房间但是怎么用
  • 很高兴为您提供帮助。如果您还有其他问题 - 只需 ping 即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多