Вопрос

Я создал простой 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));
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top