2016-06-25 5 views
0

У меня есть userControl с именем SensorControl, который я хочу привязать его dataContext к классу viewModel с именем SensorModel. Связывание успешна и начальные значения из ViewModel видна в UserControl, но проблема в том, что, когда я изменить свойства ViewModel, тем UserControl не обновляет, и я должен вручную обновлять, что (по присваивая null его текстовому контенту и снова присваивая viewModel). Вот упрощенный пример моего кода.Просмотр не обновляется с изменением viewModel

SensorControl.xml:

<UserControl ...[other attributes]... DataContext={Binding Model}> 
. 
. 
. 
<Label Content="{Binding Title}"/> 
. 
. 
. 
</UserControl> 

SensorControl.xml.cs (код-сзади):

public partial class SensorControl : UserControl 
{ 
    public SensorModel model; 

    public SensorModel Model 
    { 
     get { return model; } 
     set { model = value; } 
    } 
    public SensorControl(SensorModel sm) 
    { 
     Model = sm; 
    } 
} 

MainWindow.xml.cs:

public partial class MainWindow : Window 
{ 
    public SensorModel sensorModel_1; 
    public SensorControl sensorControl_1; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     sensorModel_1 = new SensorModel(...[some arguments]...); 
     sensorControl_1 = new SensorControl(sensorModel_1); 
     mainGrid.Children.Add(sensorControl_1); 
    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     sensorModel_1.Title = "myTitle"; 
     //The UserControl does not update 
    } 

0) Я реализовал INotifyPropertyChanged в SensorModel

1) Причина, в которой я нуждаюсь в этом, заключается в том, что в моем проекте есть только одна концепция «Датчик» (это настоящий электронный датчик), и поэтому у меня есть одна модель для нее (которая касается реального датчика, база данных и т. д.), но в пользовательском интерфейсе у меня есть несколько userControl для представления различных аспектов Sensor. Поэтому я должен создать один экземпляр модели (SensorModel) для каждого реального датчика, и несколько пользовательских контроллеров должны привязываться к этому (каждый использует разные части модели).

2) Я не так уж и новичок в WPF, но я как бы новичок в MVVM, и, возможно, я неправильно понимаю что-то существенное, поэтому я был бы признателен, если бы кто-то мог четко объяснить правильный подход.

Заранее спасибо

+0

'ViewModel' не должен быть частью' UserControl'. – AnjumSKhan

ответ

0

Спасибо всем вам, ребята, я взял ваши советы и, наконец, я нашел способ ,

1) Я реализовал событие в SensorModel, запускающий каждый раз, когда какие-либо из изменения свойств (имя ModelChanged)

2) Тогда, как Мерве & manOvision и предложил, я объявленное свойство зависимостей в SensorControl (типа SensorModel) и связывают элементы пользовательского интерфейса к этому (Binding Path=Model.Title)

3) Затем я использовал ModelChanged событие этого свойства зависимостей в SensorControl и вызвать событие (типа INotifyPropertyChanged) так привязок обновить свою ценность

Он отлично работает.

0

В вашем UserControl, удалите атрибут DataContext и добавьте х: атрибут Name. Затем в Label, связать так:

<UserControl x:Name="uc"> 
    <Label Content="{Binding ElementName=uc,Path=Model.Title}" /> 
</UserControl> 

Я считаю, что этот вопрос является DataContext не может быть установлен в модели, потому что связывание отрабатывает родительского DataContext, который будет основываться на mainGrid, когда он будет добавлен как ребенок к тому, что. Так как свойство «Модель» не существует в DataContext файла maiGrid, привязка не произойдет, поэтому ваше обновление не будет отражать. Правильное использование DataContext UserControl может быть сложным. Я использую ElementName совсем немного или создаю DependencyProperties в UserControl, а затем устанавливаю их из родителя, который будет использовать элемент управления.

0

Вам необходимо установить DataContext в класс ViewModel в вашем представлении, и если вы применяете шаблон MVVM, вы должны использовать ICommand для действий. Возможно, было бы лучше, если бы вы реализовали класс MainView, который выполняет логику в фоновом режиме вместо этого в классе MainWindow.

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new MainView(); 
    // sensorModel_1 = new SensorModel(...[some arguments]...); 
    // sensorControl_1 = new SensorControl(sensorModel_1); 
    // mainGrid.Children.Add(sensorControl_1); 
} 

Ваш MainView класс:

public class MainView { 
    public SensorControl Control {get; internal set;} 
    ... 

} 

И в вашем изменении XAML связывания:

<Label Content="{Binding Control.Model.Title}"/> 
Смежные вопросы