Я использую Listbox в приложении m WPF, где я попытался удалить SelectedItem, чтобы пользователь мог повторно щелкнуть его, чтобы выполнить действие.

У меня классический ListBox:

<ListBox
    x:Name="MenuItemList"
    Grid.Row="1"
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding MenuItems}"
    SelectedItem="{Binding SelectedMenu, UpdateSourceTrigger=PropertyChanged}">
[...] </ListBox>

Я привязал SelectedMenu к своей виртуальной машине:

public MenuItem SelectedMenu
{
    get { return null; }
    set
    {
        MenuIsOpened = false;
        DisplayedMenu = value;

        OnPropertyChanged("SelectedMenu");
    }
}

Я попробовал другой способ с частной собственностью, где я изменил его на null

private MenuItem _SelectedMenu;
public MenuItem SelectedMenu
{
    get { return _SelectedMenu; }
    set
    {
        MenuIsOpened = false;
        DisplayedMenu = value;
        _SelectedMenu = null;

        OnPropertyChanged("SelectedMenu");
    }
}

Но это работает не так, как я хочу ... Когда я нажимаю на элемент, свойство имеет значение null, но в представлении список всегда выделяет выбранный элемент, а второй щелчок по нему не запускает свойство.

0
Elsassmania 3 Сен 2020 в 11:11

2 ответа

Лучший ответ

Я делаю еще кое-что, чтобы решить свою проблему. Я не пытался изменить выбранный элемент, но я добавил команду в свой список

<ListBox
    x:Name="MenuItemList"
    Grid.Row="1"
    ItemsSource="{Binding MenuItems}"
    SelectedItem="{Binding SelectedMenu, UpdateSourceTrigger=PropertyChanged}">
        [...]
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonUp">
            <i:InvokeCommandAction Command="{Binding CloseMenuCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListBox>

И в моем MVVM я закрываю свое меню, поскольку хочу сделать это в начале:

private void ExecuteCloseMenuCommand(object o)
{
    MenuIsOpened = false;
}

Таким образом, пользователь может щелкнуть меню элемента, который уже выбран, и меню все равно будет закрыто щелчком.

0
Elsassmania 9 Сен 2020 в 05:43

Вот мой рабочий пример:

    // in constructor or so
    AddedBlocks = new ObservableCollection<string>();

    // the property
    public ObservableCollection<string> AddedBlocks { get; }

    /// <summary>
    /// Deletes selected block from view and model
    /// </summary>
    private void OnDeleteSelectedBlock(object parameter)
    {
        try
        {
            AddedBlocks.RemoveAt(selectedBlockIndex);
        }
    }

И XAML:

<ListBox ItemsSource="{Binding Blocks, Mode=OneWay}" SelectedIndex="{Binding SelectedBlockIndex, Mode=TwoWay}">
        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Delete block" Command="{Binding DeleteSelectedBlock}"/>
            </ContextMenu>
        </ListBox.ContextMenu>
    </ListBox>

Посмотрите двустороннюю привязку к selectedIndex. Возможно, его проще использовать вместо selectedItem. Надеюсь это поможет. Если вы не хотите использовать контекстное меню, добавьте кнопку или этот

<KeyBinding Key="Delete" Command="{Binding DeleteSelectedBlock}"/>
0
Master Azazel 3 Сен 2020 в 14:42