【问题标题】:Delete button on ListView itemsListView 项目上的删除按钮
【发布时间】:2015-12-07 15:23:01
【问题描述】:

我开始为 UWP 开发。我正在尝试创建一个填充有x:bindListView。现在我想在所有单个项目上创建一个按钮以删除它们。类似于 Windows 10 Mail:

我已经创建了:

<ListView x:Name="listActivity" ItemsSource="{x:Bind list}" Grid.Column="0" Header="Activity List" HorizontalAlignment="Center" Width="auto" IsItemClickEnabled="True" ItemClick="showDel">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="vm:Activity">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <TextBlock x:Name="txt" Text="{x:Bind name}" Grid.Column="0"/>
                <Button x:Name="delItem" Click="delActivity" Grid.Column="1" Visibility="Collapsed" Background="Transparent" Margin="100, 0, 0, 0">
                    <SymbolIcon Symbol="Delete"/>
                </Button>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我想更改delItem 按钮的visibility,但是从C# 中我不能用set Name 调用它。我该怎么做?

【问题讨论】:

标签: c# windows xaml listview uwp


【解决方案1】:

我建议使用绑定来执行此操作。

a) 为您的类 Activity 添加一个名为 Visible 的新属性

public class Activity : INotifyPropertyChanged
{
    public string Name { get; set; }

    private bool _visible; 
    public bool Visible {
        get { return _visible; }
        set
        {
            _visible = value;
            RaisePropertyChanged("Visible");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

b) 还声明一个新类以将布尔值转换为可见性

public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value is Visibility && (Visibility)value == Visibility.Visible;
    }
}

c) 最后更新您的绑定。不要忘记 OneWay 模式设置。

<Page.Resources>
    <local:BooleanToVisibilityConverter x:Key="VisibilityConverter"/>
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{x:Bind Activities}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:Activity">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="3*"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock x:Name="txt" Text="{x:Bind Name}" Grid.Column="0"/>
                    <Button x:Name="delItem" Click="delItem_Click" Grid.Column="1" Visibility="{x:Bind Visible, Mode=OneWay, Converter={StaticResource VisibilityConverter}}" Background="Transparent" Margin="100, 0, 0, 0">
                        <SymbolIcon Symbol="Delete"/>
                    </Button>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

您现在可以通过代码直接访问可见性或您的控件。下面的完整代码供参考。

using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace App1
{
public sealed partial class MainPage : Page
{ 
    public List<Activity> Activities { get; set; }

    public MainPage()
    {
        this.InitializeComponent();

        Activities = new List<Activity>();
        Activities.Add(new Activity { Name = "Activity1", Visible = true });
        Activities.Add(new Activity { Name = "Activity2", Visible = false });
    }

    private void delItem_Click(object sender, RoutedEventArgs e)
    {
        Activities.First().Visible = false;
    }
}

public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value is Visibility && (Visibility)value == Visibility.Visible;
    }
}

public class Activity : INotifyPropertyChanged
{
    public string Name { get; set; }

    private bool _visible; 
    public bool Visible {
        get { return _visible; }
        set
        {
            _visible = value;
            RaisePropertyChanged("Visible");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}
}

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多