Как применить MVVM Pattern в этой модели? - PullRequest
2 голосов
/ 05 сентября 2011

Проблема начинается с этого поста: Использование привязки к списку Как мне сделать так, чтобы не показывались элементы управления

Я проектировал что-то вроде этого:

List<Container>
(Below container properties)
    - Objective: string
    - Problems: List<ProblemUserControl>

ProblemUserControls - это UserControl, в котором содержится дополнительное свойство под названием Problem. Но вышеупомянутый пост человек предлагает мне использовать MVVM Pattern. Я занимаюсь расследованием, но я все еще в замешательстве или мне нужна небольшая помощь, чтобы понять шаблон в WPF.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Вот пример, иллюстрирующий использование MVVM.Обратите внимание, что нет необходимости иметь список пользовательских элементов управления, и это действительно будет считаться некорректным с точки зрения MVVM.

Это основано на шаблоне приложения WPF по умолчанию в Visual studio.

Здесьучаствуют классы.

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler changed = PropertyChanged;
        if (changed != null)
        {
            changed(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class Container : ViewModelBase
{
    private string m_Objective;
    private ProblemCollection m_Problems;

    public Container()
    {
        m_Problems = new ProblemCollection();
    }

    public string Objective
    {
        get { return m_Objective; }
        set
        {
            m_Objective = value;
            OnPropertyChanged("Objective");
        }
    }

    public ProblemCollection Problems
    {
        get { return m_Problems; }
        set
        {
            m_Problems = value;
            OnPropertyChanged("Problems");
        }
    }
}

public class Problem : ViewModelBase
{
    private string m_Name;

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

public class ProblemCollection : ObservableCollection<Problem>
{
}

И главное окно.Обратите внимание, что я закомментировал ваш прямоугольник, чтобы показать привязки

<Window x:Class="StackOverflowDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525">
  <Grid>
    <TextBlock TextWrapping="Wrap" Text="{Binding Objective}" Grid.Column="0" VerticalAlignment="Center"
        FontWeight="Bold" />
    <ItemsControl ItemsSource="{Binding Problems}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <!--<Rectangle Stroke="Black" Height="20" Width="20" Margin="1,0" />-->
          <TextBlock Text="{Binding Path=Name}" />
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>
</Window>

MainWindow.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // Create dummy test data.
        // Normally this will be passed to the window or set externally
        var container = new Container();
        container.Problems.Add(new Problem {Name = "Foo"});
        container.Problems.Add(new Problem {Name = "Bar"});
        container.Problems.Add(new Problem {Name = "hello"});
        container.Problems.Add(new Problem {Name = "world"});

        DataContext = container;
    }
}
1 голос
/ 05 сентября 2011

Шаблон - это поддержание правильного разделения и зависимостей между логическими уровнями вашего программного обеспечения. Вы путаете логику отображения с бизнес-логикой в ​​своем примере, потому что вы смешиваете код модели (контейнер целей) с кодом отображения (список пользовательских контролей).

Вместо этого сохраняйте свои цели и поддерживайте List<Problem> вместо List<ProblemUserControl>. Затем используйте WPF и привязку, чтобы связать ваш ProblemUserControl с Problem. Ваш пользовательский элемент управления понимает, что такое Problem, поэтому вы можете связываться со свойствами на Problem. Таким образом вы разделяете свои слои и значительно упрощаете анализ своего программного обеспечения в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...