2015-12-07 111 views
1

我开始为UWP开发。我正在尝试创建一个ListView,其中填入x:bind。现在我想在所有单个项目上创建一个按钮来删除它们。类似的Windows 10邮件:删除ListView项目上的按钮

我已经创建了:

enter image description here

<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#我不能用集合名称调用它。我该怎么做?

+0

要在ListView.ItemTemplate中获取一个按钮并在代码中更改它的属性,应该使用FrameworkTemplate.FindName方法。就像这个答案:http://stackoverflow.com/a/34118343/2946329 –

+0

我还建议你做什么缺少'FindName'。您应该使用我在该答案中建议的FindDescendant。 –

+0

非常感谢你似乎工作得很好:D – user2625557

回答

1

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

一)一个新的属性添加到名为可见

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)和最后更新绑定。不要忘记单向模式设置。

<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> 

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

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