He encontrado un comportamiento extraño. Si SelectedItem es SettingsItem, entonces no puede deseleccionarlo del código

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

Y eso es todo. No entiendo por qué el código no funciona para el elemento de configuración y cómo lidiar con este problema.

5
Artur Siwiak 3 mar. 2018 a las 02:44

3 respuestas

La mejor respuesta

Extendiendo la respuesta @ Martin-Zikmund. Manejo de código ahora situación si ItemsSource está configurado.

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

Esto me funciona por completo

2
Artur Siwiak 3 mar. 2018 a las 10:46

Encontré otra forma de resolverlo.

Debe agregar un elemento oculto a NavigationView:

<NavigationView Name="nv">
  <NavigationView.MenuItems>
    <NavigationViewItem Content="dsadas" />
    <NavigationViewItem Content="dsadas" />
    <NavigationViewItem Content="dsadas" />
    <NavigationViewItem Content="dsadas" />
    <NavigationViewItem x:Name="HiddenItem" Visibility="Collapsed" />
  </NavigationView.MenuItems>
<Button Click="Button_Click" Content="de select" />

Y luego puede borrar la selección:

nv.SelectedItem = HiddenItem;
0
Tirraon 28 jun. 2018 a las 22:13

Este es un error muy interesante en NavigationView, he creado un GitHub repro y lo reporté a través de Centro de comentarios.

Como solución alternativa, he creado el siguiente método de extensión "pirateo":

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

¿Como funciona? El código agrega temporalmente un nuevo NavigationViewItem al control y lo selecciona (deseleccionando así el elemento Configuración). Luego borra la selección y a elimina el elemento temporal de inmediato. Debido a que la vista se actualiza en el hilo de la interfaz de usuario, nunca podrá notar que el nuevo elemento se agrega y elimina nuevamente.

1
Martin Zikmund 3 mar. 2018 a las 10:01