2015-12-07 4 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> 

Я хочу изменить visibility из delItem кнопки, но с C# Я не могу назвать его именем набора. Как я могу это сделать?

+0

Чтобы получить кнопку внутри 'ListView.ItemTemplate' и изменить ее свойства в коде, вы должны использовать' FrameworkTemplate.FindName Method'. Как и этот ответ: 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)); 
     } 
    } 
} 

б) Объявлять также новый класс для преобразования булевой обзорности

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

с) И, наконец, обновить ваше связывание. Не забудьте установить режим 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)); 
     } 
    } 
} 
} 
Смежные вопросы