Разве плохо хранить код в коде View? - PullRequest
3 голосов
/ 12 ноября 2011

Я пытался прочитать статью WPF / Silverlight: пошаговое руководство по MVVM , но я не могу понять его полностью.

Однако я заметил такое руководство:

Это ваш View.xaml.cs, который, как предполагается, почти не имеет кода.

Как мне исправить мой код ниже? Должен ли я извлечь свой код WCF в другое место? Спасибо.

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ChannelFactory<IManagementConsole> pipeFactory =
                new ChannelFactory<IManagementConsole>(
                    new NetNamedPipeBinding(),
                    new EndpointAddress(
                        "net.pipe://localhost/PipeManagementConsole"));

        IManagementConsole pipeProxy =
          pipeFactory.CreateChannel();

        List<ConsoleData> datas = new List<ConsoleData>();
        foreach (StrategyDescriptor sd in pipeProxy.GetStrategies())
        {
            datas.Add(pipeProxy.GetData(sd.Id));
        }
        dataGrid1.ItemsSource = datas;
    }
}

1 Ответ

1 голос
/ 12 ноября 2011

Да, это плохая практика, особенно с точки зрения MVVM .

Извлечение всей бизнес-логики в класс ServiceViewModel , в View просто установите экземпляр ViewModel вDataContext:

 public MainWindow()
 {
      InitializeComponent();
      this.DataContext = new ServiceViewModel();
 }

Если у вас есть другой класс / окно, которое создает это окно, вы должны установить ViewModel внутри него.Например:

MyWindow childWindow = new MyWindow();
childWindow.DataContext = new ServiceViewModel();

Так что теперь вы можете увидеть MVVM в действии, в файле MainWindow XAML вы можете использовать привязки, как показано ниже:

<!-- Considering that ServiceViewModel has 
     public string ServiceName property 
 -->
<TextBlock Text="{Binding ServiceName}" />

<!-- Considering that ServiceViewModel has
     public List<ConsoleData> DataItems property
 -->
<DataGrid ItemsSource="{Binding DataItems}" />

Таким образом, ваша логика остается в ViewModel иотделен от View.

PS:

Я бы предложил использовать ObservableCollection<ConsoleData> для списка ConsoleData, преимущества: ( MSDN )

ObservableCollection Class

Представляет динамический сбор данных, который предоставляет уведомления, когда элементы добавляются, удаляются или обновляется весь список.

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