Установка свойства кнопки на невидимое в lisbox на основе элементов списка - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в C # и WPF и все еще изучаю веревки. В настоящее время я пытаюсь использовать ListBox для отображения некоторых предопределенных элементов в списке. Я использую ObservableCollection для хранения этих элементов и привязываю эту коллекцию к этому ListBox. Я также разрешаю пользователю добавлять новые элементы в список или обновлять выбранные в дополнение к их удалению. Для каждого элемента в этом списке я хочу отобразить кнопку УДАЛИТЬ рядом с ним. Однако каждая кнопка должна быть видимой только для элементов, которые были добавлены пользователем, а не для любого из предварительно определенных элементов.

В настоящее время я могу отображать кнопку УДАЛИТЬ для каждого элемента в списке. Поэтому мой вопрос заключается в том, можно ли установить свойство кнопки «УДАЛИТЬ» для каждого элемента в списке, которое будет отображаться только для тех элементов, которые были добавлены в него и не имеют кнопок «УДАЛИТЬ» для предопределенных (по умолчанию) элементов? Если так, как бы я поступил так? (Это то, что я пытаюсь выяснить.)

Должен ли я опубликовать свой код?

Спасибо

Вот режим просмотра, в котором есть список и элементы управления для добавления новых элементов в список.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <ListBox x:Name="DrinksListBox" HorizontalAlignment="Center" Height="325" Width="275" Margin="0,0,0,0" VerticalAlignment="Center" Grid.Column="0">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0,2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Type}" Width="80"  Margin="0,0,10,0" Grid.Column="0"/>
                    <TextBlock Text="{Binding Name}" Width="80"  Margin="0,0,10,0" Grid.Column="1" HorizontalAlignment="Left"/>
                    <Button x:Name="DrinkDeleteButton" Content="Delete" Click="CmdDeleteDrink_Clicked" HorizontalAlignment="Right" Grid.Column="2"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <TextBox x:Name="DrinkNameTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="45" Margin="0,0,0,100" TextWrapping="Wrap" Text="Enter Drink Name" VerticalAlignment="Center" Width="240" FontSize="20" VerticalContentAlignment="Center"/>
    <ComboBox x:Name="DrinkTypeComboBox" Grid.Column="1" HorizontalAlignment="Left" Margin="0,47,0,0" VerticalAlignment="Top" Width="240" Height="45" ItemsSource="{Binding Drinks,  Mode=OneWay}" DisplayMemberPath="Type" FontSize="20"/>
    <Button x:Name="AddDrinkButton" Content="Add Drink" Grid.Column="1" HorizontalAlignment="Right" Margin="0,0,10,100" VerticalAlignment="Center" Width="100" Height="45" Click="CmdAddDrink_Clicked"/>
</Grid>

Вот мой код. У меня есть внутренний класс для свойства напитка и основной класс, который устанавливает используемый список.

public partial class MainWindow : Window
{
    public ObservableCollection<Drinks> Drinks { get; private set; }

    public MainWindow()
    {
        InitializeComponent();

        Drinks = new ObservableCollection<Drinks>();

        Drinks.Add(new Drinks("Soda", "Pepsi"));            
        Drinks.Add(new Drinks("Tea", "Lemon"));
        Drinks.Add(new Drinks("Caffinated", "Coffee"));
        Drinks.Add(new Drinks("Other", "Water"));

        DrinksListBox.ItemsSource = Drinks;
        DrinkTypeComboBox.ItemsSource = Drinks;
    }

    private void CmdDeleteDrink_Clicked(object sender, RoutedEventArgs e)
    {
        Button cmd = (Button)sender;

        if (cmd.DataContext is Drinks deleteDrink)
        {
            Drinks.Remove(deleteDrink);
        }
    }

    private void CmdAddDrink_Clicked(object sender, RoutedEventArgs e)
    {
        string typeSelection = ((Drinks)DrinkTypeComboBox.SelectedItem).Type;

        Drinks.Add(new Drinks(typeSelection, DrinkNameTextBox.Text));
    }
}

У класса напитка есть тип напитка и название для него. общедоступные напитки { закрытый тип строки; имя приватной строки;

    public Drinks(string type, string name)
    {
        this.type = type;
        this.name = name;
    }

    public string Type
    {
        get { return type; }

        set
        {
            if (type != value)
            {
                type = value;
            }
        }
    }

    public string Name
    {
        get { return name; }

        set
        {
            if (name != value)
            {
                name = value;
            }
        }
    }
}

1 Ответ

0 голосов
/ 27 августа 2018

Допустим, у вас есть ваш товар:

public class Drinks
{
    //your properties, simplified for clarity
    public string Name {get;set;}
    public string Type {get;set;}

    //hey, a new one!
    public bool IsUserDefined {get;set;}
}

Затем, когда пользователь добавляет один:

private void CmdAddDrink_Clicked(object sender, RoutedEventArgs e)
{
    string typeSelection = ((Drinks)DrinkTypeComboBox.SelectedItem).Type;

    Drinks.Add(new Drinks(typeSelection, DrinkNameTextBox.Text)
    {
         IsUserDefined = true
    });
}

отказ от ответственности : от макушки моей головы; обычно это означает синтаксические ошибки; убрал некоторые детали для наглядности.

<!-- In your resources section of the XAML -->
<BooleanToVisibilityConverter x:Key="BoolToVis" />

<ListBox x:Name="DrinksListBox" ItemSource="{Binding Drinks}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Type}"/>
                <TextBlock Text="{Binding Name}"/>
                <Button x:Name="DrinkDeleteButton" 
                     Visibility="{Binding Path=IsUserDefined, 
                               Converter={StaticResource BoolToVis}}"/>
                    <!-- note: left out some attributes for clarity -->
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Это должно сработать.


Кстати, вы, кажется, смешиваете какое-то типичное кодирование в стиле MVVM и кодовое кодирование. Стоит сказать, что вы могли бы извлечь выгоду, используя ViewModel в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...