2013-09-02 2 views
1

У меня проблема с привязкой моего usercontrol к объекту в mainwindow. Я не знаю, что не так.WPF usercontrol привязка к объекту не работает

Я создал пользовательский MyUserControl управления, который имеет изменяемую текстовое поле

MyUsrControl.xaml

<UserControl x:Class="UserControlToObject.MyUsrControl" 
      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"    
      mc:Ignorable="d" 
      d:DesignHeight="70" d:DesignWidth="200">  
    <StackPanel Orientation="Horizontal"> 
     <Label Grid.Row="0" Grid.Column="0" Margin="5">Name</Label>    
     <TextBox Grid.Row="0" Grid.Column="1" Margin="5" Name="tbxName"></TextBox> 
    </StackPanel> 
</UserControl> 

Далее я определил DP, чтобы изменить это текстовое поле вне countrol

MyUsrControl.xaml.cs

namespace UserControlToObject 
{ 
    public partial class MyUsrControl : UserControl 
    { 
     public static readonly DependencyProperty EmpNameProperty = DependencyProperty.Register("EmpNameProperty", typeof(string), typeof(MyUsrControl),   
           new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, EmpNamePropertyChanged)); 

     public string EmpName 
     { 
      get 
      { 
       return (string)GetValue(EmpNameProperty); 
      } 
      set 
      { 
       SetValue(EmpNameProperty, value); 
      } 
     } 

     public MyUsrControl() 
     { 
      InitializeComponent();    
     } 

     static void EmpNamePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      MyUsrControl x = (MyUsrControl)sender; 
      x.tbxName.Text = (string)e.NewValue; 
     } 
    } 
} 

Далее, я определил класс Employee - свойства объекта этого класса будет отображаться на пользовательском элементе управления

namespace UserControlToObject 
{ 
    /// <summary> 
    /// Employee class 
    /// </summary> 
    class Employee : INotifyPropertyChanged 
    { 
     string m_name, m_surname; 

     public event PropertyChangedEventHandler PropertyChanged; 

     /// <summary> 
     /// Employee name property 
     /// </summary> 
     public string Name 
     { 
      get { return m_name; } 
      set 
      { 
       m_name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 

     /// <summary> 
     /// Employee surname property 
     /// </summary> 
     public string Surname 
     { 
      get { return m_surname; } 
      set 
      { 
       m_surname = value; 
       OnPropertyChanged("Surname"); 
      } 
     } 

     public Employee() 
     { 
      m_name = "unknown name"; 
      m_surname = "unknown surname"; 
     } 

     public Employee(string name, string surname) 
     { 
      m_name = name; 
      m_surname = surname; 
     }  

     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 

    } 

И наконец MainWindow.xaml

<Window x:Name="myApp" x:Class="UserControlToObject.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:UserControlToObject"   
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <local:MyUsrControl x:Name="ucEmp" EmpName="{Binding Name}"></local:MyUsrControl> 
     <Label Content="{Binding ElementName=ucEmp, Path=EmpName}"></Label> 

    </StackPanel> 
</Window 

>

MainWindow.xaml. cs

namespace UserControlToObject 
{ 
    public partial class MainWindow : Window 
    { 
     Employee anEmployee; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      anEmployee = new Employee("John", "Wayne"); 

      this.DataContext = anEmployee;   
     } 

    } 

}

Эта линия не работает (ошибка о том, что я могу установить обязательную силу только на DependencyProperty ... из DependencyObject):

<local:MyUsrControl x:Name="ucEmp" EmpName="{Binding Name}"></local:MyUsrControl> 

Эти параметры ниже работ, так что я думаю, что это проблема с моим Employee класс (СТГ не хватает?)

<local:MyUsrControl x:Name="ucEmp" EmpName="John"></local:MyUsrControl> --> set EmpName ok 
<Label Content="{Binding ElementName=ucEmp, Path=EmpName}"></Label> --> get EmpName ok 

Я понятия не имею Whot неправильно, поэтому будет очень greatfull помощь

Я сделал т он же, но привязывал TextBox вместо пользовательского контроля и не был проблемой. TextBox.Text - свойство зависимостей, аналогичное моему Employee.EmpName

ответ

0

«EmpNameProperty» в вашей собственности Registeration должно быть «» EmpName «» ш.

Thanks

3

При регистрации свойства зависимостей вам нужно использовать имя, которое вы хотите использовать в XAML. В вашем случае, это EmpName и не EmpNameProperty:

public static readonly DependencyProperty EmpNameProperty = DependencyProperty. 
    Register("EmpName", typeof(string), typeof(MyUsrControl), new 
    FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions. 
    BindsTwoWayByDefault, EmpNamePropertyChanged)); 
+0

Еще один вопрос. Почему эта привязка работает в одну сторону. Если я набираю текст в элементе управления anEmployee.Name, это не изменяется. Но если я изменю anEmployee.Name в коде, текст будет введен в действие. Я даже установил режим TwoWay, но никаких результатов – czechoww

+0

@czechoww: ваш пользовательский элемент управления не использует привязку данных внутри, и вы не используете другой способ записи содержимого текстового поля в свойство. Если этот комментарий не решает эту проблему, вы должны задать новый вопрос. –

+0

Вы правы. Я добавил настройку EmpNameProperty на событие TextChange, и теперь он отлично работает. Тонкс снова. – czechoww

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