Связывание для ListView с использованием customControl - PullRequest
0 голосов
/ 26 мая 2020

У меня есть 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; }
}

There is the result

Вот и результат. Вот что я хочу, это что-то вроде

Logistique
   Item1
   Item2
   Item3

Кто-то знает, что я должен делать в моем xaml? Я уже пробовал

  • Parent.BindingContext.TitleChoiceMenu
  • ListMenu.TitleChoiceMenu
  • Binding Path = TitleChoiceMenu
...