2016-01-29 5 views
0

У меня есть три проекта в моем решении:UserControl DataContext Связывание

  • Моего главного приложение WPF, который содержит MainWindow + MainViewModel
  • UserControl библиотеку с UserControl (ConfigEditorView)
  • Класс UIProcess с ViewModel для UserControl (ConfigEditorViewModel)

В моем MainWindow я хочу использовать UserControl с ViewModel UIProcess.

Сначала я поставил UserControl в моих MainWindow:

<TabItem Header="Editor"> 
    <Grid> 
    <cel:ConfigEditorView DataContext="{Binding ConfEditModel, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    </Grid> 
</TabItem> 

Я не знаю, какой из этих свойств мне нужно здесь, так что я положил все вместе, но он по-прежнему не работает.

Тогда я поставил это в моем MainViewModel:

public ConfigEditorViewModel ConfEditModel { get; set; } 

С простым методом, который связан с кнопкой:

private void doSomething() 
{ 
    ConfEditModel = new ConfigEditorViewModel("Hello World"); 
} 

Моего ConfigEditorViewModel выглядит в основном так:

public class ConfigEditorViewModel : ViewModelBase 
{ 
    private string _Description; 
    public string Description 
    { 
     get 
     { 
      return _Description; 
     } 
     set 
     { 
      _Description = value; 
      base.RaisePropertyChanged(); 
     } 
    } 

    public ConfigEditorViewModel(string t) 
    { 
     Description = t; 
    } 
} 

Описание привязано к TextBox в моем UserControl.

<TextBox Grid.Row="1" Grid.Column="1" Margin="0,0,0,10" Text="{Binding Description}"/> 

Когда я запускаю приложение и нажимаю кнопку «Текст», TextBox должен содержать «Hello World», но он пуст.

Что я сделал не так?

+3

Ваш ConfEditModel не уведомляет UI изменения, поэтому DataContext вашего cel: ConfigEditorView не обновляется. – nkoniishvt

+0

http://stackoverflow.com/questions/28175338/hair-loss-and-mvvm-user-controls – blindmeis

+0

Спасибо @nkoniishvt Я сделал не считал, что при кодировании, но теперь он работает нормально. – Marlon

ответ

1

Модели вашего вида (и, при необходимости, модели) необходимо реализовать INotifyPropertyChanged.

Связывание не является магическим. Нет встроенного механизма, который позволяет уведомлять код при изменении значения старого старого свойства. Вам нужно будет опросить его, чтобы проверить, произошло ли изменение, что было бы очень плохо, с точки зрения производительности.

Так что привязки будут смотреть на объекты, с которыми они связаны, и посмотреть, реализуют ли они INotifyPropertyChanged и, если да, подписываются на событие PropertyChanged. Таким образом, когда вы меняете свойство и запускаете событие, связывание уведомляется и обновляет пользовательский интерфейс.

Будьте осторожны, вы должны реализовать интерфейс и использовать его правильно. This example says it's for 2010, но он отлично работает.

2

я дал вам общий ответ:

в «реальном (а UserControl вы хотите использовать с различным ViewModels с разными именами свойств)» UserControl вам привязку только к вашему собственному DependencyProperties и вы делаете это с ElementName или RelativeSource, и вы должны никогда не устанавливать DataContext в UserControl.

<UserControl x:Name="myRealUC" x:class="MyUserControl"> 
    <TextBox Text="{Binding ElementName=myRealUC, Path=MyOwnDPIDeclaredInMyUc, Path=TwoWay}"/> 
<UserControl> 

, если вы делаете, что вы можете легко использовать этот UserControl в любом виде, как:

<myControls:MyUserControl MyOwnDPIDeclaredInMyUc="{Binding MyPropertyInMyViewmodel}"/> 

и для полноты: Зависимость от собственности

public readonly static DependencyProperty MyOwnDPIDeclaredInMyUcProperty = DependencyProperty.Register(
    "MyOwnDPIDeclaredInMyUc", typeof(string), typeof(MyUserControl), new PropertyMetadata("")); 

    public bool MyOwnDPIDeclaredInMyUc 
    { 
     get { return (string)GetValue(MyOwnDPIDeclaredInMyUcProperty); } 
     set { SetValue(MyOwnDPIDeclaredInMyUcProperty, value); } 
    } 
Смежные вопросы