簡體   English   中英

如何在ListView綁定中創建/注冊view / vewmodel的多個實例?

[英]How to create/register multiple instances of view/vewmodel in a ListView binding?

使用具有棱鏡和統一性的mvvm編寫C#wpf應用程序,我找不到如何解決應該是常見的恕我直言的情況的答案:

在具有(xaml)綁定的ListView中顯示多個視圖。

在視圖模型中具有一個名為MainTableItemsControl / MainTableItemsControlViewModel的View / ViewModel, MainTableItemsControlViewModel具有一個集合:

public WpfObservableRangeCollection<base_main> BaseData { get; set; }

我想做的是: 不是使用硬編碼的xaml, 而是使用視圖(包括viewmodel)來顯示BaseData集合中的每個對象。

問題:

應該怎么做? (最好是與棱鏡和MVVM方式統一)

(如何為集合中的每個對象創建視圖/視圖模型對的單獨實例,並將其與xaml中的綁定一起使用)

也許需要一種完全不同的方法? 經過數小時的測試和調查,我找不到面對這種情況的單個示例。

到目前為止,我使用了一種解決方法。 我對此表示滿意,因為它起作用了...直到我遇到不允許我進行操作的新問題(例如,我無法獲取/通過區域管理器以進一步為每個實例定義視圖/視圖模型)。

我不滿意的解決方法(不是應該用MVVM的方式):

每個base_main對象(在Model中)都會創建自己的View Model,作為其構造的base_main

public class base_main :INotifyPropertyChanged
{
  public ViewModels.SingleArticleItemViewModel single_vm { get; set; }
  public base_main()
  {
     single_vm = new ViewModels.SingleArticleItemViewModel(this);
  }
//(...)
}

MainTableItemsControlViewModel引用了一個集合

public class MainTableItemsControlViewModel : INotifyPropertyChanged
{
public MainTableItemsControlViewModel(IRegionManager RegionManager, IEventAggregator eventAggregator)
        {
            _regionManager = RegionManager;
            _eventAggregator = eventAggregator;

            BaseDataCollection = Model.MySingletonBaseDataCollection;

            BaseDataViews = (ListCollectionView)CollectionViewSource.GetDefaultView(BaseDataCollection);
        }
}

並且該集合在MainTableItemsControl用於創建類型為SingleArticleItem的視圖的列表(綁定集合: ItemsSource="{Binding BaseDataViews}"並提供數據上下文: DataContext="{Binding Path=single_vm}"

<ListView VirtualizingStackPanel.IsVirtualizing="True" ScrollViewer.CanContentScroll="True" 
                  ItemsSource="{Binding BaseDataViews}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type views:SingleArticleItem}">
                    <views:SingleArticleItem DataContext="{Binding Path=single_vm}" Margin="0"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            //(...)
</ListView>

這樣,我為每個base_main對象構造了一個View / ViewModel對,設置了數據上下文以直接連接ViewModel(SingleArticleItem xaml不是自動連接的:pyramid prism:ViewModelLocator.AutoWireViewModel="False"

即使它正在“工作”,但它根本不是mvvm的方法,並且有其局限性,因為進一步的解決方法有其局限性。 例如。 在產生的SingleArticleItem實例中,我無法及時獲取RegionManager(不是實例化)。 對於事件聚合器,在任何屬性更改事件上都會調用此方法

if (_eventAggregator == null && ServiceLocator.IsLocationProviderSet)
  {
    _eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
   InformUpdateCommand = new DelegateCommand(InformUpdate);
 }

每個base_main對象(在Model中)都會創建自己的View Model,作為其構造的蜜蜂:

 public class base_main : INotifyPropertyChanged { public ViewModels.SingleArticleItemViewModel single_vm { get; set; } public base_main() { single_vm = new ViewModels.SingleArticleItemViewModel(this); } } 

那是錯誤的方法,反之亦然。 不是模型創建視圖模型,而是視圖模型包含對該模型的引用。 視圖模型是為一種或多種類型的一個或多個模型創建的,甚至不必是一對一的關系。

因此,帶您去收集模型,並在想要顯示該模型的視圖模型中從中創建視圖模型的集合。 另外,如果用戶可以創建新模型或新模型來自原始模型來源,請添加代碼以同步兩個集合。 提示:如果您無法幫助,請執行完全雙向同步,因為這將需要大量代碼和更多測試...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM