У меня есть navigationBar (который является настраиваемым элементом управления), и я хочу создать ListView в этом элементе управления. CViewNvBar - это имя x: на панели навигации моего представления содержимого.
Итак, я создаю представление списка следующим образом:
<ListView ItemsSource="{Binding Source={x:Reference CViewNvBar}, Path=ListMenu}"
SelectedItem="{Binding Source={x:Reference CViewNvBar}, Path=SelectedChoice}"
IsGroupingEnabled="True">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding HeadingValue}" />
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Image Source="{Binding ImageChoiceMenu }" Margin="10,10,0,0" WidthRequest="32" HeightRequest="32"/>
<Label Text="{Binding TitleChoiceMenu }" VerticalOptions="CenterAndExpand" Margin="0,10,10,0"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Вот мой navigationBar.xaml.cs:
public ObservableCollection<ListMenuItem> ListMenu
{
get { return (ObservableCollection<ListMenuItem>)GetValue(ListMenuProperty); }
set { SetValue(ListMenuProperty, value); }
}
public static BindableProperty ListMenuProperty = BindableProperty
.Create("ListMenu",
typeof(ObservableCollection<ListMenuItem>),
typeof(NavigationBar),
null,
BindingMode.Default
, propertyChanged: ListMenuPropertyChanged
);
private static void ListMenuPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var control = (NavigationBar)bindable;
control.ListMenu = (ObservableCollection<ListMenuItem>)newValue;
}
В конструкторе я установил привязку для моего ListMenu, чтобы управлять им в модели представления:
this.SetBinding(NavigationBar.ListMenuProperty, new Binding("NvbListMenu", source: bindableObject.BindingContext));
В моей модели представления я создаю переменную «NvbListMenu»:
private ObservableCollection<ListMenuItem> _nvbListMenu;
public ObservableCollection<ListMenuItem> NvbListMenu { get { return _nvbListMenu; } set { SetProperty(ref _nvbListMenu, value); } }
И, наконец, я инициализирую свой список с помощью этого метода:
private void CreateList() {
NvbListMenu = new ObservableCollection<ListMenuItem>
{
new LogiStock.UI.ContentViews.Custom.Menu.ListMenuItem
{
MenuItems = new List<MenuItem>
{
new MenuItem
{
TitleChoiceMenu = "Acceuil",
ImageChoiceMenu = Device.RuntimePlatform == "Android" ? "home_white" : "Assets/home_white_small.png"
},
}, HeadingValue = "Acceuil"
},
new LogiStock.UI.ContentViews.Custom.Menu.ListMenuItem
{
MenuItems = new List<MenuItem>
{
new MenuItem
{
TitleChoiceMenu = "Préparation",
ImageChoiceMenu = Device.RuntimePlatform == "Android" ? "preparation" : "Assets/preparation_small.png"
},
new MenuItem
{
TitleChoiceMenu = "Chargement",
ImageChoiceMenu = Device.RuntimePlatform == "Android" ? "chargement" : "Assets/chargement_small.png"
},
new MenuItem
{
TitleChoiceMenu = "Planning préparation",
ImageChoiceMenu = Device.RuntimePlatform == "Android" ? "preparation" : "Assets/preparation_small.png"
},
new MenuItem
{
TitleChoiceMenu = "Planning chargement",
ImageChoiceMenu = Device.RuntimePlatform == "Android" ? "chargement" : "Assets/chargement_small.png"
},
}, HeadingValue = "Logistique"
},
};
}
Вот мой класс MenuItem и ListMenuItem
public class MenuItem
{
public string TitleChoiceMenu { get; set; }
public string ImageChoiceMenu { get; set; }
}
public class ListMenuItem
{
public string HeadingValue { get; set; }
public List<MenuItem> MenuItems { get; set; }
}
Вот и результат. Вот что я хочу, это что-то вроде
Logistique
Item1
Item2
Item3
Кто-то знает, что я должен делать в моем xaml? Я уже пробовал
- Parent.BindingContext.TitleChoiceMenu
- ListMenu.TitleChoiceMenu
- Binding Path = TitleChoiceMenu