Шаблон MVVM, вопрос ViewModel DataContext

Вы можете добавить в свой код операторы debugger, чтобы остановить выполнение, что позволит вам шагать по коду. Точно так же вы можете запустить процесс Node с аргументом --inspect-brk , чтобы использовать Chrome DevTools для пошагового выполнения кода.

8
задан Dave Clemmer 29 July 2011 в 18:31
поделиться

3 ответа

Вы должны просто удалить строку:

DataContext = new ChildViewModel();

DataContext вид будет установлен автоматически WPF. DataTemplates всегда имеют свой контекст данных, установленный на данные для шаблона (в данном случае ViewModel):

8
ответ дан 5 December 2019 в 12:12
поделиться

Самый простой способ Для связи между ViewModels с использованием подхода MVVM используется шаблон Mediator (EventAggregator в Prism). Хороший пример такого подхода можно увидеть по следующим ссылкам:

  1. Шаблон медиатора MVVM от Sacha Barber
  2. Медиатор MVVM + от Марлона Греча

Также ознакомьтесь с примером проекта MVVM .

5
ответ дан 5 December 2019 в 12:12
поделиться

Допустим, у вас есть QueueView, который использует QueueViewModel.

public class QueueViewModel : INotifyPropertyChanged
{
    public ParentType Parent { get; set; }

    public QueueViewModel(ParentType parent)
    {
        this.Parent = parent;
        foreach (ChildType child in Parent)
        {
            child.PropertyChanged += delegate(object sender,
                PropertyChangedEventArgs e)
            {
                if (e.PropertyName != "IsSelected")
                    return;

                //do something like this:
                Parent.IsSelected = AllChildrenAreSelected();
            };
        }
    }

}

public class ParentType : INotifyPropertyChanged
{
    private bool _isSelected;

    public IList<ChildType> Children { get; set; }
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }
}

public class ChildType : INotifyPropertyChanged
{
    private string _name;
    private bool _isSelected;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }
}

- Часть QueueView

<StackPanel>
<CheckBlock Text="{Binding Path=Parent.Name}" 
            IsChecked="{Binding Parent.IsSelected}"/>
<ItemsControl ItemsSource="{Binding Path=Parent.Children}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>                                    
            <CheckBox Content="{Binding Path=Name}"
                      IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"/>
        </DataTemplate>
    <ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
1
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: