UWP-MVVM-使用ItemTemplate按钮删除ListView项目

我有一个显示项目列表的屏幕,用户可以在该屏幕上单击按钮以从列表中删除相应的项目。

我正在尝试使用MVVM这样做。

但是,当该项目执行操作时,它并不知道包含列表。我在这里和那里看到了一些答案,但是没有一个使用我在环境中具有的现成的MVVM功能。

这是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); }


慕容森
浏览 310回答 3
3回答

慕森卡

将x:Name="listView"属性添加到您的ListView,然后在模板中<Button Grid.Column="1"&nbsp; &nbsp; Command="{Binding ElementName=listView, Path=DataContext.RemoveItemCommand}"&nbsp; &nbsp; CommandParameter="{Binding}" >但是,当我遇到这样的问题时,我通常只是在后面使用代码。这样做的原因是,我可以在Visual Studio中为C#代码使用调试器,但是调试这些复杂的绑定要困难得多。这是一个C#版本,代码是IMO清洁器,更易于调试:void removeItem_Click( object sender, RoutedEventArgs e ){&nbsp; &nbsp; object i = ((FrameworkElement)sender).DataContext;&nbsp; &nbsp; ( this.DataContext as MyViewModel )?.RemoveItem( i );}也许那只是我的个人喜好。

一只斗牛犬

最好在列表视图中具有上下文菜单项(或页面上某处的删除按钮)以删除当前选定的项。然后,您可以从列表视图中获得选择。或者,您可以将上下文菜单附加到PrepareContainterForItemOverride中的列表视图项(并在另一个Override方法中将其分离)那将是一种更加标准的交互方式。如果必须在列表视图项中包含按钮,那么获取列表项的最简单方法可能是使用可视树帮助器从按钮转到列表视图项,然后从列表中获取实际项查看项目。
打开App,查看更多内容
随时随地看视频慕课网APP