【问题标题】:Custom logic in windows forms data bindingWindows 窗体数据绑定中的自定义逻辑
【发布时间】:2014-09-30 23:45:00
【问题描述】:

刚从使用 Knockout.js 的 Web 开发转移到 windows 窗体,我正在阅读绑定,我的目标是实现类似于 Knockout 的 MVVM 架构,但在 windows 窗体中。

也就是说,我在尝试对控件的绑定应用自定义逻辑时遇到问题,例如,我想将错误标签的 Visible 属性绑定到 ViewModel 类中名为 IsValid 的函数的结果

我怎样才能做到这一点?

【问题讨论】:

  • winforms 不支持 MVVM(也没有任何用处)。您正在寻找 WPF。
  • 我已经有遗留代码,所以除非有一种廉价的转换方式,否则我不会搬家,但是,只需一种体面的方式进行自定义绑定将是一个巨大的进步
  • 好的,发布你的答案,解释 windows 窗体中缺少什么以及为什么无法实现缺少的功能,我会接受它

标签: winforms mvvm


【解决方案1】:

Winforms(vb.net 代码) 中的下一个 DataBinding 示例有什么问题:

Public Class Info
    Implements INotifyPropertyChanged

    Private _Word As string
    Public Property Word As String
        Get
            Return _Word
        End Get
        Set(value As String)
            If value.Equals(_Word) = False Then
                _Word = value
                Me.NotifyPropertyChanged("Word")
            End If
        End Set
    End Property


    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Private Sub NotifyPropertyChanged(propertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

    Public Sub New(newWord As String)
        Me.Word = newWord
    End Sub

    Public Function IsValid() As Boolean
        Return (String.IsNullOrEmpty(Me.Word) = False)
    End Function
End Class

表格的代码

Public Class frmInfo
    Private _info As Info

    Public Sub New(inInfo As String)
        InitializeComponent()
        _info= New Info(inInfo)
    End Sub

    Private Sub frmInfo_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.txtID.DataBindings.Add("Text", _info, "Word") 'Add DataBinding for Word property
        'Binding label Visible property to result of the IsValid function
        Dim bind As New Binding("Visible", _info, "Word")
        AddHandler bind.Format, Sub(obj As Object, args As ConvertEventArgs) args.Value = _raha.IsValid()
        Me.lblEven.DataBindings.Add(bind)
    End Sub

End Class

【讨论】:

  • 当然...您也可以方便地忽略 MVVM 中 winforms 中无法实现的部分,例如数据模板。回避不会让 winforms 没用。
  • 这段代码的一个问题是它实际上绑定到属性“Word”,如果我有另一个属性也可能影响“IsValid”函数的结果,那么它不会被绑定。
  • 我发现了一个有趣的方法,就是将“IsValid”变成一个只读属性,绑定到它,然后从所有其他设置器中引发 Me.NotifyPropertyChanged("IsValid")
  • 对,或者您可以在 IsValid 属性内提高 Me.NotifyPropertyChanged("IsValid"),但在“IsValid”组中包含的属性的每个 Setter 中为此设置值:Me.IsValid = Me.IsValuesValid()
  • @Fabio 我以前没有看到你的评论,出于某种原因......哈哈......你一定是在开玩笑......我指的是this之类的东西,很明显不受支持,并且需要在老式无用的已弃用平台(如 winforms)中进行大量可怕的黑客攻击......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
相关资源
最近更新 更多