понимание MVVM - PullRequest
       19

понимание MVVM

0 голосов
/ 29 июня 2011

я пытаюсь понять mvvm.я хочу прочитать производителя с моего компьютера, вот в чем цель.

Проблема: - ярлык в xaml пуст

Мое понимание:

  • BindСвойства ViewModel для ControlElements.
  • Создание экземпляра из ViewModel с помощью ObjectDataProvider
  • Заполнение ViewModel через репозиторий

Я надеюсь, что любой может помочь мне понятьmvvm pattern.

my xaml:

<Window x:Class="MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:get="clr-namespace:MVVM"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      <TabControl Name="tabControl1">
        <TabItem Header="Uebersicht" Name="tabUeberischt">
          <TabItem.Resources>
            <ObjectDataProvider x:Key="OverviewData" ObjectType="{x:Type get:VM_lalala}" MethodName="GetDataFromRep" />
          </TabItem.Resources>

          <DockPanel>
            <Grid>
              <Grid.RowDefinitions>
                <RowDefinition Height="26" />
                <RowDefinition Height="26" />
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
              </Grid.ColumnDefinitions>
              <Label Content="Hersteller: " Grid.Row="0" Grid.Column="0"/>
              <Label Content="{Binding Path=Hersteller, Source={StaticResource OverviewData}}" Grid.Row="0" Grid.Column="1"/>
            </Grid>
          </DockPanel>
        </TabItem>
      </TabControl>
    </Grid>
</Window>

и вот мой код c #:

namespace MVVM
{
    class VM_lalala : VM_Base
    {

        private string _Hersteller;
        private UebersichtRepository _Rep;

        public string Hersteller
        {
            get { return this._Hersteller; }
            set
            {
                if (this._Hersteller != value)
                {
                    this._Hersteller = value;
                    this.NotifyPropertyChanged("Hersteller");
                }
            }
        }

        public void GetDataFromRep()
        {
            _Rep.GetInfo(this);
        }

        public VM_lalala()        
        {
            this._Rep = new UebersichtRepository();          
        }

    }

    class UebersichtRepository : VM_Base
    {
        private static VM_lalala _ViewModel;

        public bool GetInfo(VM_lalala Aktu_ViewModel)
        {
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_ComputerSystem");               

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    _ViewModel.Hersteller = queryObj["Manufacturer"].ToString();
                }

                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return false;
                throw;
            }
        }
    }

    class VM_Base : INotifyPropertyChanged
    {


        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

    }
}

РЕДАКТИРОВАТЬ: на примере от Стива Б я пересмотрел код:

  • VM_lalala переименована в ViewModelUebersicht
  • , добавьте класс UebersichtWerte, представляющий один элемент модели представления
  • Удалите зависимости

теперь это работаетгодов.Вопрос в том, правильно ли заполнять Viewmodel в его собственном методе (GetDataFromRep).

Рабочий процесс теперь:

  • XAML TabItem.Resource создает экземпляр ViewModelUebersicht
  • В конструкторе вызывать метод GetDataFromRep
  • Вызовы GetDataFromRep Getinfo
  • Getinfo возвращает represanting объект из необходимых значений
  • в GetdataFromRep значения, упорядоченные вручную длясвойства ViewModelUebersicht

является жалобой рабочего процесса с мышлением и шаблоном mvvm?

новый код c #:

   public class UebersichtWerte : VM_Base
   {
       public string Hersteller;
       public string Model;
   }

    public class ViewModelUebersicht : VM_Base
    {

        private string _Hersteller;
        private string _Modell;
        private UebersichtRepository _Rep;

        public string Hersteller
        {
            get { return this._Hersteller; }
            set
            {
                if (this._Hersteller != value)
                {
                    this._Hersteller = value;
                    this.NotifyPropertyChanged("Hersteller");
                }
            }
        }
        public string Modell
        {
            get { return this._Modell; }
            set
            {
                if (this._Modell != value)
                {
                    this._Modell = value;

                }
            }
        }

        public void GetDataFromRep()
        {
            UebersichtWerte _PCDATA = new UebersichtWerte();
            _PCDATA = _Rep.GetInfo();
            this.Hersteller = _PCDATA.Hersteller;
            this.Modell = _PCDATA.Model;
        }

        public ViewModelUebersicht()        
        {
            this._Rep = new UebersichtRepository();
            GetDataFromRep();
        }

    }


    class UebersichtRepository
    {    
        public UebersichtWerte GetInfo()
        {
            try
            {
                UebersichtWerte _DATA = new UebersichtWerte();
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_ComputerSystem");               

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    _DATA.Hersteller = queryObj["Manufacturer"].ToString();
                    _DATA.Model = queryObj["Model"].ToString();
                }

                return _DATA;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return null;
                throw;
            }
        }
    }

и новый код XAML:

<Window x:Class="MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:VM="clr-namespace:MVVM"
        Title="MainWindow" Height="350" Width="525">

  <Grid>
      <TabControl Name="tabControl1">
        <TabItem Header="Uebersicht" Name="tabUeberischt">
                <TabItem.Resources>
                    <VM:ViewModelUebersicht  x:Key="VM_Uebersicht" />
                </TabItem.Resources>
                <DockPanel>
                    <Grid DataContext="{StaticResource VM_Uebersicht}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="26" />
                                <RowDefinition Height="26" />
                                <RowDefinition Height="26" />
                                <RowDefinition Height="26" />
                                <RowDefinition Height="26" />
                                <RowDefinition Height="26" />
                                <RowDefinition Height="26"/>
                                <RowDefinition Height="26"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Label Content="Hersteller: " Grid.Row="0" Grid.Column="0"/>
                            <Label Content="{Binding Hersteller, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="1"/>
                            <Label Content="Modell: " Grid.Row="1" Grid.Column="0"/>
                            <Label Content="{Binding Modell, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1"/>                            
                        </Grid>
                </DockPanel>
        </TabItem>
      </TabControl>
    </Grid>
</Window>

Ответы [ 4 ]

1 голос
/ 29 июня 2011

Несколько шагов:

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

public class UebersichtRepository 
{


    public string GetInfo()
    {
        string result = null;

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_ComputerSystem");               

            foreach (ManagementObject queryObj in searcher.Get())
            {
                result = queryObj["Manufacturer"].ToString();
            }

        return result;            
    }
}

, затем в коде вызова просто:

public void GetDataFromRep()
{
    this.Hersteller = _Rep.GetInfo();
}

Во-вторых, чтобы запуститьДля извлечения данных вы можете просто вызвать GetDataFromRep

Наконец, вы должны правильно настроить привязки.Возможный способ - определить текстовый текст непосредственно для экземпляра вашей виртуальной машины:

<Window.Resources>
    <vm:VM_lalala  x:Key="lalala" />
</Window.Resources>

, а затем просто связать вашу метку:

<Label Content="{Binding Hersteller}" Grid.Row="0" Grid.Column="1"/>
0 голосов
/ 29 июня 2011

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

<Grid DataContext="{Binding Source={StaticResource OverviewData}}" >

В противном случае привязки не имеют контекста, который они могут использовать.

0 голосов
/ 29 июня 2011

Несколько комментариев к части MVVM:

Ваш UebersichtRepository будет частью «Модель» Model-View-ViewModel.Следовательно, он не должен быть производным от VM_Base - он даже не использует свойства, которые могут измениться.

Также Модель не должна зависеть от ViewModel.Интересно, почему код выполняется без исключения Nullpointer, поскольку вы передаете Aktu_ViewModel в качестве аргумента, но позже задаете _ViewModel.Hersteller - а сам _ViewModel никогда не устанавливается.Но в любом случае вы должны полностью удалить Aktu_ViewModel и _ViewModel и вместо этого возвращать информацию, а не бул.Bool особенно бесполезен, так как вы используете исключения для обработки ошибок.

Кто вызывает метод GetDataFromRep?

0 голосов
/ 29 июня 2011

вы можете использовать Window ресурсы для указания статического ресурса, который будет отображаться для вашего ViewModel следующим образом:

<Window.Resources>
    <vm:VM_lalala  x:Key="viewmodel" />
</Window.Resources> 

Затем вы можете использовать его как DataContext вашей таблицы.

 <Grid DataContext="{StaticResource viewmodel}">

Затем вы можете написать

 <Label Content="{Binding Hersteller}" Grid.Row="0" Grid.Column="1"/>

Также используйте public class вместо class.

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