2013-03-08 2 views
0

Я создаю объект UserControl, и я пытаюсь назначить значения с помощью Binding (с PropertyChanged). Я создал прототип, когда я назначаю значение в ViewModel, значение не отображается или не изменяет компонент UserControl, но если я назначу значение непосредственно в объекте UserControl, который находится в поле зрения, это изменение работает. Я хотел бы понять, что я делаю неправильно, так как отлично работает, если я просто добавляю объект в свое окно и привязываю напрямую (опять же, используя PropertyChanged). Следуйте приведенному ниже коду.Confused about Binding in UserControl

Спасибо за любую помощь.

С наилучшими пожеланиями,

Gustavo.

UserControl:

<UserControl x:Class="WpfControlLibrary1.UserControl1" 
     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="30" d:DesignWidth="300"> 
<Grid> 
    <TextBlock Text="{Binding Title}" /> 
</Grid> 
</UserControl> 

код За контроля пользователя:

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    #region Title Property 

    public static String GetTitle(DependencyObject obj) 
    { 
     return (String)obj.GetValue(TitleProperty); 
    } 

    public static void SetTitle(DependencyObject obj, String value) 
    { 
     obj.SetValue(TitleProperty, value); 
    } 

    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.RegisterAttached(
      "Title", 
      typeof(String), 
      typeof(UserControl1), 
      new FrameworkPropertyMetadata(TitleChangedCallback) 
      ); 

    private static void TitleChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     UserControl1 _this = (d as UserControl1); 
    } 

    private String title; 
    public String Title 
    { 
     get { return title; } 
     set 
     { 
      title = value; 
      OnPropertyChanged("Title"); 
     } 
    } 

    #endregion 

    #region INotifyPropertyChanged event and method 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    #endregion 

** My Window: **

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:uc="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <uc:UserControl1 Title="{Binding TitleVM, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</Grid> 
</Window> 

** Мой код-Behind/ViewModel: **

public partial class MainWindow : INotifyPropertyChanged 
{ 
    // Notify WPF that Counter changed 
    public event PropertyChangedEventHandler PropertyChanged; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     TitleVM = "açsldkfjasçldkfj"; 
    } 

    private String titleVM; 
    public String TitleVM 
    { 
     get { return titleVM; } 
     set 
     { 
      titleVM = value; 
      OnPropertyChanged("TitleVM"); 
     } 
    } 

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

} 

ответ

0

С помощью HighCore, я нашел одну проблему, и другая проблема заключалась в том, что у моего UserControl не указано имя.

Просто положи:

x:Name="UserControl" 

В XAML из UserControl и будет работать. Кроме того, я изменил свой код позади:

 public String Title 
    { 
     get { return (String)base.GetValue(TitleProperty); } 
     set { base.SetValue(TitleProperty, value); } 
    } 

    public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.RegisterAttached(
     "Title", 
     typeof(String), 
     typeof(UserControl1), 
     new FrameworkPropertyMetadata(null) 
     ); 

Чистый код для наших глаз.

PS: Там нет необходимости ставить:

DataContext = this; 

О кодексе Позади UserControl. По крайней мере, здесь только результат по ошибке, никаких значений не было.

Спасибо HighCore за помощь.

2

Window не имеет DataContext. Связывание не может быть разрешено.

Попробуйте это:

public MainWindow() 
{ 
    InitializeComponent(); 

    DataContext = this; //This is what you're missing! 

    TitleVM = "açsldkfjasçldkfj"; 
} 

Edit:

Вы также отсутствует то же самое в UserControl

public UserControl1() 
{ 
    InitializeComponent(); 
    DataContext = this; 
} 
+0

Спасибо за ответ. Я добавил это, и я могу видеть точки останова, чем значения, но то, что отображается, - это только текст «MainWindow», а не «açsldkfjasçldkfj». Любые подсказки? –

+1

@ GustavoGonçalves см. Мое редактирование. –

+0

Я тоже это сделал. Но когда я делаю это, мои точки останова внутри UserControl1.xaml.cs, за исключением того, что в TitleProperty не входят, они не получают никакого значения из MainWindow. –