feat: add function to set selected item from outside and sync to UI.
This commit is contained in:
@@ -26,10 +26,10 @@
|
||||
Grid.ColumnSpan="2">
|
||||
Collapse
|
||||
</ToggleButton>
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
Text="{ReflectionBinding #menu.SelectedItem.Header}" />
|
||||
<StackPanel Grid.Row="1" Grid.Column="0">
|
||||
<TextBlock Text="{Binding SelectedMenuItem.Header}" />
|
||||
<Button Command="{Binding RandomCommand}">Random a selection</Button>
|
||||
</StackPanel>
|
||||
<Border
|
||||
Grid.Row="2"
|
||||
Grid.Column="0"
|
||||
@@ -42,6 +42,7 @@
|
||||
IconBinding="{Binding IconIndex}"
|
||||
IsHorizontalCollapsed="{Binding #collapse.IsChecked, Mode=OneWay}"
|
||||
ItemsSource="{Binding MenuItems}"
|
||||
SelectedItem="{Binding SelectedMenuItem}"
|
||||
SubMenuBinding="{Binding Children}">
|
||||
<u:NavMenu.Styles>
|
||||
<Style x:DataType="vm:MenuItem" Selector="u|NavMenuItem">
|
||||
@@ -62,20 +63,20 @@
|
||||
</DataTemplate>
|
||||
</u:NavMenu.IconTemplate>
|
||||
<u:NavMenu.Header>
|
||||
<Grid ColumnDefinitions="Auto, Auto" HorizontalAlignment="Center">
|
||||
<Grid HorizontalAlignment="Center" ColumnDefinitions="Auto, Auto">
|
||||
<Image
|
||||
u:NavMenu.CanToggle="True"
|
||||
Width="48"
|
||||
Height="48"
|
||||
Margin="4 12"
|
||||
Margin="4,12"
|
||||
u:NavMenu.CanToggle="True"
|
||||
RenderOptions.BitmapInterpolationMode="HighQuality"
|
||||
Source="../Assets/Ursa.ico" />
|
||||
<TextBlock
|
||||
Grid.Column="1"
|
||||
Classes="H5"
|
||||
VerticalAlignment="Center"
|
||||
Text="Ursa Avalonia"
|
||||
Classes="H5"
|
||||
IsVisible="{Binding !#menu.IsHorizontalCollapsed}"
|
||||
Text="Ursa Avalonia"
|
||||
Theme="{DynamicResource TitleTextBlock}" />
|
||||
</Grid>
|
||||
</u:NavMenu.Header>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Input;
|
||||
@@ -9,6 +10,13 @@ namespace Ursa.Demo.ViewModels;
|
||||
|
||||
public class NavMenuDemoViewModel: ObservableObject
|
||||
{
|
||||
private MenuItem? _selectedMenuItem;
|
||||
|
||||
public MenuItem? SelectedMenuItem
|
||||
{
|
||||
get=>_selectedMenuItem;
|
||||
set => SetProperty(ref _selectedMenuItem, value);
|
||||
}
|
||||
public ObservableCollection<MenuItem> MenuItems { get; set; } = new ObservableCollection<MenuItem>
|
||||
{
|
||||
new MenuItem { Header = "Introduction" , Children =
|
||||
@@ -54,6 +62,30 @@ public class NavMenuDemoViewModel: ObservableObject
|
||||
new MenuItem { Header = "TwoTonePathIcon" },
|
||||
new MenuItem { Header = "ThemeToggler" }
|
||||
};
|
||||
|
||||
public ICommand RandomCommand { get; set; }
|
||||
public NavMenuDemoViewModel()
|
||||
{
|
||||
RandomCommand = new RelayCommand(OnRandom);
|
||||
}
|
||||
|
||||
private void OnRandom()
|
||||
{
|
||||
var items = GetLeaves();
|
||||
var index = new Random().Next(items.Count);
|
||||
SelectedMenuItem = items[index];
|
||||
}
|
||||
|
||||
private List<MenuItem> GetLeaves()
|
||||
{
|
||||
List<MenuItem> items = new();
|
||||
foreach (var item in MenuItems)
|
||||
{
|
||||
items.AddRange(item.GetLeaves());
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
public class MenuItem
|
||||
@@ -77,4 +109,22 @@ public class MenuItem
|
||||
}
|
||||
|
||||
public ObservableCollection<MenuItem> Children { get; set; } = new ObservableCollection<MenuItem>();
|
||||
|
||||
public IEnumerable<MenuItem> GetLeaves()
|
||||
{
|
||||
if (this.Children.Count == 0)
|
||||
{
|
||||
yield return this;
|
||||
yield break;
|
||||
}
|
||||
|
||||
foreach (var child in Children)
|
||||
{
|
||||
var items = child.GetLeaves();
|
||||
foreach (var item in items)
|
||||
{
|
||||
yield return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user