ObjectDataProvider в MVVM не нужно?
-
01-10-2019 - |
Вопрос
Я создал простой MVVM, только с тремя классами CashflowView, CashflowViewModel, CashFlowModel.
Я использую инфрагистичный 9.1 XamdataPrensenter (или xamdataGrid).
<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Source={StaticResource CashFlowData}}">
<ObjectDataProvider x:Key="CashFlowData" ObjectType="{x:Type ViewModel:CashflowViewModel}" MethodName="GetCashFlows" />
Внутри мой просмотр:
public ObservableCollection<CashflowModel> GetCashFlows()
{
return new ObservableCollection<CashflowModel>() { ... };
}
ViewModel подключен к просмотру этим:
this.DataContext = new CashflowViewModel();
Пока я подключаю сетку к объектуDataProvider его идеально запускается нормально. Но я хотел бы просто подключиться к недвижимости в моем просмотру моделя вместо этого.
Согласно инфрагистике, все, что мне нужно сделать, это это:
<igDP:XamDataGrid DataSource="{Binding Path=ViewModelCollection}"/>
Но в этом случае мне кажется, что мне нужно связать с коллекцией другого ViewModel, чтобы представлять мои строки внутри сетки. И вот где я запутался.
Я попробовал это, и это не работает:
<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Path=CashFlows}">
Внутри ViewModel:
public ObservableCollection<CashflowDataGridViewModel> CashFlows
{
get
{
return new ObservableCollection<CashflowDataGridViewModel>();
}
}
Но как мне создать второй ViewModel (CashFlowdataGridViewModel)?
Я пытался добавить эту пробеку в течение этого второго ViewModel:
public CashflowModel CashFlow
{
get
{
return new CashflowModel() {...};
}
}
Но все, что я получаю на моем просмотре, - это заголовок столбца «Cashflow» без каких-либо основных заголовков фактического класса CashflowModel.
Решение
Чтобы иметь возможность привязывать вид на свойства на ViewModel, DataContext должен быть установлен на экземпляр вашего ViewModel. Что я обычно делаю, это включить следующую строку в конструкторе кода-позади для моего мнения:
this.DataContext = new SomeAwesomeViewModel();
Вы также можете установить DataContext для контейнеров, если вы хотите, чтобы разные группы элементов управления использовать разные программы просмотра (например, Grid.daTaContext, StackPanel.dataContext и т. Д.).
После того, как у вас есть набор данных DataContext, вы должны быть в состоянии привязать свойства этого ViewModel.
Обновлять
Вот немного примерного кода, чтобы заставить вас идти.
public class CashFlowViewModel
{
public ObservableCollection<FlowViewModel> DataGridData
{
get...
}
}
Это свойство, которое должно предоставить данные для DataGrid. Теперь, вот что FlowViewModel
Класс может выглядеть так.
public class FlowViewModel
{
decimal flowAmount;
public decimal FlowAmount
{
get { return flowAmount; }
set
{
if(flowAmount == value)
return;
flowAmount = value;
NotifyPropertyChanged("FlowAmount");
}
}
.
.
.
private void NotifyPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}