2017-02-22 9 views
1

Я создал простой файл UserControl, в котором есть TextBox, и я также создал класс Person, который имеет два свойства: «FirstName» и «LastName».Связать разные свойства класса с двумя экземплярами одного и того же UserControl

Я хочу повторного использования то же UserControl, но связать различные свойства из класса Person к каждому экземпляру этого UserControls TextProperty.

Итак, я создал два экземпляра этого же TextBox UserControl в Form1, разместив их как в двух отдельных элементах ElementHost.

Теперь я пытаюсь связать первый TextBox UserControls TextProperty с классом «FirstName» класса Person, а другой TextBox UserControl TextProperty для свойства «LastName» класса Person. Который я не знаю, как это сделать.

Конечным результатом должно быть два экземпляра моего TextBox UserControl, один из которых отображает первое имя класса Person, а другой экземпляр, отображающий фамилию классов Person. По мере изменения свойств класса Person FirstName или LastName изменения должны отражаться на каждом UserControl посредством привязки.

Я знаю, что может добавить два из TextBoxs в один UserControl с StackPanel или что-то подобное и установить стягивание в XAML, но это не то, что я хочу. Есть ли способ связать UserControls с другими классами из-за пределов их xaml или обратного кода?

UserControl код - TextBoxUC.xaml

код
<UserControl x:Class="TextBoxUC" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:ClassPropertiesToTextBox" 
     mc:Ignorable="d" 
     d:DesignHeight="30" d:DesignWidth="300"> 
    <Grid> 
     <TextBox x:Name="tbx" /> 
    </Grid> 
</UserControl> 

Person.vb Класс Код

Public Class Person 
    Implements INotifyPropertyChanged 

    Private _firstname As String 
    Public Property FirstName() As String 
    Get 
     Return _firstname 
    End Get 
    Set(ByVal value As String) 
     _firstname = value 
     NotifyPropertyChanged("FirstName") 
    End Set 
    End Property 

    Private _lastname As String 
    Public Property LastName() As String 
    Get 
     Return _lastname 
    End Get 
    Set(ByVal value As String) 
     _lastname = value 
     NotifyPropertyChanged("LastName") 
    End Set 
    End Property 

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
    Private Sub NotifyPropertyChanged(ByVal propertyName As String) 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 
End Class 

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 

ответ

0

Можно добавить свойство строковых зависимостей в UserControl класса (TextBoxUC.xaml.vb):

Public Class TextBoxUC 

    Public Property Text() As String 
     Get 
      Return CType(Me.GetValue(TextProperty), Boolean) 
     End Get 
     Set(ByVal value As String) 
      Me.SetValue(TextProperty, value) 
     End Set 
    End Property 

    Public Shared ReadOnly TextProperty As DependencyProperty = DependencyProperty.Register("Text", GetType(String), GetType(TextBoxUC), New PropertyMetadata(Nothing)) 
End Class 

И связывает TextBox в UserControl (TextBoxUC.xaml) к этому:

<TextBox x:Name="tbx" Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 

Тогда можно просто связать это свойство зависимостей к свойству PersonDataContext как обычно:

<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> 

Edit: Или вы могли бы связать свойство зависимостей программна:

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")) 
+0

Вы связывание классов Person «ПгвЬЫате» в 'TextBox UserControl' в окне приложения WPF, но мне нужно, чтобы создать этот как в моем примере, или я не прочь передать класс Person в 'Form1.vb' в качестве ссылки на «TextBoxUC» 'UserControl' в' Form1', может быть, через конструктор или метод и создание привязки в коде, стоящем за этим 'UserControl', но я не знаю, какой код установить это , Я использую приложение Windows Form, а не приложение WPF, но я интегрирую 'UserControls' через элементы управления ElementHost'. – C9C

+0

Я также пробовал свойства зависимостей, но я не знаю, как подключить его через код, только через xaml. Спасибо в любом случае – C9C

+0

Я обновил свой ответ на примере того, как программно связывать свойство зависимостей. Надеюсь, это поможет. – mm8

Смежные вопросы