я пытаюсь понять 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>