C# 将类的不同属性绑定到同一UserControl的两个实例

C# 将类的不同属性绑定到同一UserControl的两个实例,c#,wpf,vb.net,xaml,user-controls,C#,Wpf,Vb.net,Xaml,User Controls,我创建了一个简单的UserControl,里面有一个TextBox,我还创建了一个Person类,它有两个属性“FirstName”和“LastName” 我想重用相同的UserControl,但将Person类的不同属性绑定到该UserControlsTextProperty的每个实例 因此,我在Form1中创建了同一个TextBox UserControl的两个实例,将它们分别托管在两个独立的ElementHost控件中 现在我尝试将第一个TextBox UserControlsTextPr

我创建了一个简单的
UserControl
,里面有一个
TextBox
,我还创建了一个Person类,它有两个属性“FirstName”和“LastName”

我想重用相同的
UserControl
,但将Person类的不同属性绑定到该
UserControls
TextProperty的每个实例

因此,我在
Form1
中创建了同一个
TextBox UserControl
的两个实例,将它们分别托管在两个独立的
ElementHost
控件中

现在我尝试将第一个
TextBox UserControls
TextProperty绑定到我的Person类“FirstName”属性,另一个
TextBox UserControl
TextProperty绑定到我的Person类“LastName”属性。我不知道该怎么做

最终结果应该是my
TextBox UserControl的两个实例,一个显示Person类的名字,另一个显示Person类的姓氏。当我更改Person classes FirstName或LastName属性时,这些更改应该通过绑定反映到每个
UserControl

我知道我可以用
StackPanel
或类似的东西将两个
textbox
添加到一个
UserControl
中,并在xaml中设置绑定,但这不是我想要的。有没有办法将
UserControls
从xaml或后台代码之外绑定到其他类

用户控制代码-TextBoxUC.xaml

Form1.vb类代码

Public Class Form1

  'first TextBox UserControl to display Persons FirstName'
  Dim WithEvents tbxFirstNameUC As TextBoxUC
  'second TextBox UserControl to display Persons LastName'
  Dim WithEvents tbxLastNameUC As TextBoxUC
  'Person class to be used'
  Dim p As Person

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    p = New Person
    p.FirstName = "Homer"
    p.LastName = "Simpson"


    tbxFirstNameUC = New TextBoxUC
    'Set DataContext to my Person class instance'
    tbxFirstNameUC.DataContext = p
    'Set binding of Person classes FirstName to my first instance TextBox UserControls Text Property'
    'Cant get TextBoxes TextProperty'
    tbxFirstNameUC.tbx.SetBinding(tbxFirstNameUC.tbx.Text, New Binding("FirstName", p, p.FirstName))
    'host FirstName TextBox UserControl as a child of ElementHost control'
    hostTbxFN.Child = tbxFirstNameUC


    tbxLastNameUC = New TextBoxUC
    'Set DataContext to my Person class instance'
    tbxLastNameUC.DataContext = p
    'Set binding of Person classes FirstName to my first instance TextBox UserControls Text Property'
    'Cant get TextBoxes TextProperty'
    tbxLastNameUC.tbx.SetBinding(tbxLastNameUC.tbx.Text, New Binding("LastName", p, p.LastName))
    'host LastName TextBox UserControl as a child of ElementHost control'
    hostTbxLN.Child = tbxLastNameUC
  End Sub
End Class

您可以向
UserControl
类(TextBoxUC.xaml.vb)添加字符串依赖项属性:

并将
UserControl
(TextBoxUC.xaml)中的
TextBox
绑定到此:

<TextBox x:Name="tbx" Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}" />
编辑:或者您可以通过编程方式绑定依赖项属性:

p = New Person
p.FirstName = "Homer"
p.LastName = "Simpson"

tbxFirstNameUC = New TextBoxUC
'Set DataContext to my Person class instance'
tbxFirstNameUC.DataContext = p
tbxFirstNameUC.SetBinding(TextBoxUC.NameProperty, New Binding("FirstName"))

您可以向
UserControl
类(TextBoxUC.xaml.vb)添加字符串依赖项属性:

并将
UserControl
(TextBoxUC.xaml)中的
TextBox
绑定到此:

<TextBox x:Name="tbx" Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}" />
编辑:或者您可以通过编程方式绑定依赖项属性:

p = New Person
p.FirstName = "Homer"
p.LastName = "Simpson"

tbxFirstNameUC = New TextBoxUC
'Set DataContext to my Person class instance'
tbxFirstNameUC.DataContext = p
tbxFirstNameUC.SetBinding(TextBoxUC.NameProperty, New Binding("FirstName"))

您正在将Person类“FirstName”绑定到WPF应用程序窗口中的
TextBox UserControl
,但我需要像我的示例中那样在Windows窗体中创建此绑定,否则我不介意在
Form1.vb
中传递Person类,作为对
Form1
中的“TextBoxUC”
UserControl
的引用,可能是通过构造函数或方法,并在
UserControl
后面的代码中创建绑定,但我不知道设置该绑定的代码。我使用的是Windows窗体应用程序,不是WPF应用程序,但我通过
ElementHost
控件集成了
UserControls
。我还尝试了依赖项属性,但我不知道如何通过代码连接,只通过xaml。无论如何,谢谢。我用一个示例更新了我的答案,说明了如何以编程方式绑定到dependency属性。希望这会有所帮助。在使更新的解决方案正常工作时遇到问题,发现需要将.SetBinding(TextBoxUC.NameProperty,…)更改为TextBoxUC.TextProperty,才能在文本框中显示。感谢您将Person类“FirstName”绑定到WPF应用程序窗口中的
TextBox UserControl
,但我需要像我的示例中那样在Windows窗体中创建此绑定,否则我不介意在
Form1.vb
中传递Person类,作为对
Form1
中的“TextBoxUC”
UserControl
的引用,可能是通过构造函数或方法,并在
UserControl
后面的代码中创建绑定,但我不知道设置该绑定的代码。我使用的是Windows窗体应用程序,不是WPF应用程序,但我通过
ElementHost
控件集成了
UserControls
。我还尝试了依赖项属性,但我不知道如何通过代码连接,只通过xaml。无论如何,谢谢。我用一个示例更新了我的答案,说明了如何以编程方式绑定到dependency属性。希望这会有所帮助。在使更新的解决方案正常工作时遇到问题,发现需要将.SetBinding(TextBoxUC.NameProperty,…)更改为TextBoxUC.TextProperty,才能在文本框中显示。谢谢
<Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ClassPropertiesToTextBox"
        mc:Ignorable="d"
        Title="Window1" Height="300" Width="300">
    <Window.DataContext>
        <local:Person FirstName="Mickey" LastName="Mouse" />
    </Window.DataContext>
    <StackPanel>
        <local:TextBoxUC Text="{Binding FirstName}" />
    </StackPanel>
</Window>
p = New Person
p.FirstName = "Homer"
p.LastName = "Simpson"

tbxFirstNameUC = New TextBoxUC
'Set DataContext to my Person class instance'
tbxFirstNameUC.DataContext = p
tbxFirstNameUC.SetBinding(TextBoxUC.NameProperty, New Binding("FirstName"))