如何将模型中的对象绑定到WPF中的用户控件?

eivnm1vs  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在尝试填充用户控件中的标签。我的用户控件的代码隐藏创建了一个对象,我正在尝试将标签内容绑定到该对象中的属性。创建对象的类实现了INotifyPropertyChanges,并且有几个公共属性。我在XAML中创建了绑定,Visual Studio已经接受了这一点,intellisense为我提供了要绑定的属性。但是,当我运行时,标签都是空白的。
如果我直接在代码中创建一个属性,然后从对象调用(并适当地更改我的datacontext),它就可以工作。
我不是太有经验的WPF -我一定错过了什么,但我只是不知道什么?!
当我的XAML看起来像这样时,两个标签都没有填充。如果我将数据上下文调整到控件而不是instrument对象,则ConStatus标签会适当地填充(但不会更新,因为用户控件没有实现INotifyPropertyChange

<WrapPanel Grid.Row="1" DataContext="{Binding instrument}">
            <Label Name="PortName" Width="100" Content="{Binding ConnectionString}"  HorizontalAlignment="Right"/>
            <Label  Name="ConStatus" Width="200" Content="{Binding UniName}" HorizontalAlignment="Left"/>
        </WrapPanel>

我的代码隐藏看起来像这样:

Public Class UnifaceControl
    Inherits UserControl

    Public instrument As UnifaceModel

    Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        FindUniface("uniface")
    End Sub

    Public Sub FindUniface(Portname As String)
        instrument = New UnifaceModel(Portname)
        instrument.Connect()
    End Sub

    ReadOnly Property UniName
        Get
            Return instrument.Connected
        End Get
    End Property

End Class

下面是UnifaceModel对象的示例:

Public Class UnifaceModel
    Implements INotifyPropertyChanged

    Shared Log As NLog.Logger = NLog.LogManager.GetCurrentClassLogger()

    Dim _ConnectionString As String
    Public Property ConnectionString As String
        Get
            Return _ConnectionString
        End Get
        Set(value As String)
            _ConnectionString = value
            OnPropertyChanged()
        End Set
    End Property

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Protected Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = Nothing)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub
ugmeyewa

ugmeyewa1#

instrument必须是一个 property 才能绑定到它:

Public Property instrument As UnifaceModel

但是你还需要在某处设置控件或其父窗口的DataContext

Sub New()
    ' This call is required by the designer.
    InitializeComponent()

    ' Set the DataContext to itself
    DataContext = Me

    ' Add any initialization after the InitializeComponent() call.
    FindUniface("uniface")
End Sub

由于您当前绑定到UserControl本身和instrument的属性,因此不应将DataContext绑定到instrument

<WrapPanel Grid.Row="1">
    <Label Name="PortName" Width="100" Content="{Binding instrument.ConnectionString}"  HorizontalAlignment="Right"/>
    <Label  Name="ConStatus" Width="200" Content="{Binding UniName}" HorizontalAlignment="Left"/>
</WrapPanel>

相关问题