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”属性。我不知道该怎么做
最终结果应该是myTextBox 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"))