【发布时间】:2018-10-10 23:53:51
【问题描述】:
我有一个显示项目列表的屏幕,用户可以单击按钮从列表中删除相应的项目。
我正在尝试使用 MVVM。
但该项目在获取操作时并不知道包含列表。 我在这里和那里看到了一些答案,但没有一个使用我在我的环境中拥有的开箱即用的 MVVM 功能 例如使用 PRISM 的那个(不知道我是否也应该使用它,它是标准的吗?):
这是 XAML:
<ListView ItemsSource="{Binding MyItemList}" SelectionMode="None" ScrollViewer.VerticalScrollMode="Disabled" ItemContainerTransitions="{x:Null}">
<ListView.ItemTemplate>
<DataTemplate >
<Grid Grid.Row="1" HorizontalAlignment="Stretch" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Text="{Binding ItemClass.Property01, Mode=TwoWay}" />
<Button Grid.Column="1" Command="{Binding RemoveItemCommand}" >
<SymbolIcon Symbol="Cancel" />
</Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这里是 ModelView 列表:
private static ObservableCollection<ItemClass> _MyItemList = new ObservableCollection<ItemClass> {
new ItemClass{ Property01 = "Sometext" }
};
public ObservableCollection<ItemClass> MyItemList { get { return _MyItemList; } }
并且我希望能够执行以下操作(主模型视图中的代码示例,如果需要解决问题,我可以创建一个项目模型视图):
public IMvxCommand RemoveItemCommand { get; private set; }
public MyViewModel(IUserDialogs dialogs)
{
RemoveItemCommand = new MvxCommand(RemoveItem);
}
public void RemoveItem(object theItem) { MyItemList.Remove(theItem); }
【问题讨论】:
-
如果列表项不知道 hte 列表,您有两个选择: 使用路由事件使容器(引用列表)来处理点击 |让项目知道列表。我认为你不需要做任何特别的事情。假设您没有编写代码来重用 ViewModel 实例,一旦 Item 超出范围,它将不会将列表保留在内存中。循环引用在 .NET 中并不少见,但是可能有更好的方法我不知道。
标签: c# listview mvvm uwp listviewitem