Как создать экземпляр ViewModel из другой модели представления - PullRequest
5 голосов
/ 06 августа 2011

Я новичок в MVVM, я следовал статье Джоша Смита , и я изо всех сил пытаюсь разработать свою первую попытку.В моем случае у меня есть главное окно с моделью основного вида:

var vm = new MainVM();
MainWindow window = new MainWindow();
window.DataContext = vm;

У меня есть две модели представления ItemSuppliersViewModel, SuppliersViewModel, связанные с двумя представлениями ItemSuppliers, SuppliersView с использованием datatemplateв главном окне resourcedictionary следующим образом:

<DataTemplate DataType="{x:Type VM:ItemSuppliersViewModel}">
    <VV:ItemSuppliersView/>
</DataTemplate>
<DataTemplate DataType="{x:Type VM:SuppliersViewModel}">
    <VV:SuppliersView/>
</DataTemplate>

В главном окне у меня есть список, отображающий список элементов, связанных:

<ListBox x:Name="ItemsListBox" ItemsSource="{Binding AllItems}" SelectedItem="{Binding     SelectedItem}" DisplayMemberPath="Item_Name" />

AllItems является общедоступнымсвойство, предоставляемое моделью основного вида:

public IList<Item> AllItems { get { return (IList<Item>)_itemsRepository.FindAll(DetachedCriteria.For<Item>()); } }

Когда пользователь выбирает элемент из списка, отображается список некоторых данных, связанных с этим элементом, представленных ItemSuppliers Модель просмотра и ItemSuppliersViewи отображается в сетке с помощью itemscontrol:

<Grid Margin="246,132,93,94">
        <ItemsControl ItemsSource="{Binding ItemSuppliersVM}" Margin="4"/>
    </Grid>

ItemSuppliersVM отображается в модели основного вида следующим образом:

ItemSuppliersViewModel itemSuppliersVM;
public ItemSuppliersViewModel ItemSuppliersVM
    {
        get
        {
            return _itemSuppliersVM;
        }
        set
        {
            _itemSuppliersVM = value;
            OnPropertyChanged("ItemSuppliersVM");
        }
    }

Вот свойство selecteditem, которое связанок выбранному элементу списка:

    public Item SelectedItem
    {
        get
        {
            return _selectedItem;
        }
        set
        {
            _selectedItem = value;
            OnPropertyChanged("SelectedItem");
            ShowItemSuppliers();
        }
    }

showItemSuppliers, который создает модель представления itemsuppliers:

void ShowItemSuppliers()
    {         
        _itemSuppliersVM = new ItemSuppliersViewModel(_itemsRepository, _selectedItem, new DateTime(2011, 03, 01), new DateTime(2011, 03, 30));
    }

Проблема заключается в том, что при выборе любого элемента в окне списка ничего не происходило,Тем не менее, itemsrepository проверен и работает нормально, когда я, кроме точки разрываt все привязки работают, и он проходит через свойство selecteditem, а затем метод showitemsuppliers().

Я думаю, что проблема в этом методе, так что не так, и этот метод правильныйспособ создания ItemSuppliersViewModel в модели представления основного окна?

1 Ответ

3 голосов
/ 06 августа 2011

Вы устанавливаете поле напрямую и не вызываете событие PropertyChanged. Без вызова этого события механизм связывания не будет знать, что ваша собственность изменилась. Если вы измените

_itemSuppliersVM = new ItemSuppliersViewModel(_itemsRepository, _selectedItem, new DateTime(2011, 03, 01), new DateTime(2011, 03, 30));

до

ItemSuppliersVM = new ItemSuppliersViewModel(_itemsRepository, _selectedItem, new DateTime(2011, 03, 01), new DateTime(2011, 03, 30));

Ваша привязка должна работать.

...