NavigationView - when the selected settings item is missing, it is impossible to cancel it from the code

I found strange behavior. If SelectedItem is a SettingsItem parameter, then you cannot undo it from the code.

XAML:

<NavigationView Name="nv">
    <NavigationView.MenuItems>
        <NavigationViewItem Content="dsadas" />
        <NavigationViewItem Content="dsadas" />
        <NavigationViewItem Content="dsadas" />
        <NavigationViewItem Content="dsadas" />
    </NavigationView.MenuItems>
    <Button Click="Button_Click" Content="de select" />
</NavigationView>

CS:

private void Button_Click(object sender, RoutedEventArgs e)
{
    nv.SelectedItem = null;
}

And it's all. I do not understand why the code does not work for the settings item and how to deal with this problem.

+4
source share
2 answers

Extension of Martin-Sikmund answer. Code processing now occurs if ItemSource is installed.

public static class NavigationViewExtension
{
    public static void ClearSelection(this NavigationView navigationView)
    {
        var temporaryItem = new NavigationViewItem();

        if (navigationView.MenuItemsSource != null)
        {
            var existingList = ((IList)(navigationView.MenuItemsSource));
            existingList.Add(temporaryItem);
            navigationView.SelectedItem = temporaryItem;
            navigationView.SelectedItem = null;
            existingList.Remove(temporaryItem);
        }
        else
        {
            navigationView.MenuItems.Add(temporaryItem);
            navigationView.SelectedItem = temporaryItem;
            navigationView.SelectedItem = null;
            navigationView.MenuItems.Remove(temporaryItem);
        }
    }
}

It works for me completely

+1
source

This is a very interesting bug in NavigationView, I created a GitHub reproper and reported it through the Feedback Center .

As a workaround, I created the following "hack" extension method:

public static class NavigationViewExtensions
{
    public static void ClearSelection(this NavigationView navigationView)
    {
        var temporaryItem = new NavigationViewItem();
        navigationView.MenuItems.Add(temporaryItem);
        navigationView.SelectedItem = temporaryItem;
        navigationView.SelectedItem = null;
        navigationView.MenuItems.Remove(temporaryItem);
    }
}

? NavigationViewItem ( , "" ). . , .

0

Source: https://habr.com/ru/post/1694376/


All Articles