2015-11-21 4 views
1

В настоящее время я получаю «Свойство» Элементы «не имеют доступного сеттера». Как я могу изменить этот элемент управления, чтобы я мог привязать к нему коллекцию и, возможно, просто установить свойства объектов в коллекции на свойство text элементов?Bind Observable Collection to MenuFlyoutSubItem в UWP

 <AppBarButton x:Name="Button" Icon="Add" Label="stuff"> 
      <AppBarButton.Flyout> 
       <MenuFlyout> 
        <MenuFlyoutItem Text="b1" ></MenuFlyoutItem> 
        <MenuFlyoutItem Text="b2" ></MenuFlyoutItem> 
        <MenuFlyoutItem Text="b3" ></MenuFlyoutItem> 
        <MenuFlyoutItem Text="b4" ></MenuFlyoutItem> 
        <MenuFlyoutItem Text="b5" ></MenuFlyoutItem> 
        <MenuFlyoutSubItem x:Name="bb1" Items="{Binding MyList}" /> 
       </MenuFlyout> 
      </AppBarButton.Flyout> 
     </AppBarButton> 

ответ

2

Вы не можете сделать этого. Если вы посмотрите at documentation, вы увидите, что Элементы имеют только геттер, поэтому не могут установить для него коллекцию. Вы можете получить ссылку на подборку, а затем, например, Добавьте к ней, но кажется, что это работает до тех пор, пока не появится всплывающее окно. После этого изменения не применяются (хотя у меня нет много времени, чтобы поиграть с ним). Вот код, где я пытался что-то с вложенным свойством:

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Button Content="click"> 
     <Button.Flyout> 
      <MenuFlyout> 
       <MenuFlyoutItem Text="b1"/> 
       <MenuFlyoutItem Text="b2"/> 
       <MenuFlyoutSubItem Name="mysub" local:MenuExtension.MyItems="{Binding Options}" Text="Choosable items"/> 
      </MenuFlyout> 
     </Button.Flyout> 
    </Button> 
    <Button Content="modify" Click="Button_Click"/> 
</StackPanel> 
public static class MenuExtension 
{ 
    public static List<MenuFlyoutItem> GetMyItems(DependencyObject obj) 
    { return (List<MenuFlyoutItem>)obj.GetValue(MyItemsProperty); } 

    public static void SetMyItems(DependencyObject obj, List<MenuFlyoutItem> value) 
    { obj.SetValue(MyItemsProperty, value); } 

    public static readonly DependencyProperty MyItemsProperty = 
     DependencyProperty.Register("MyItems", typeof(List<MenuFlyoutItem>), typeof(MenuExtension), 
     new PropertyMetadata(new List<MenuFlyoutItem>(), (sender, e) => 
     { 
      Debug.WriteLine("Filling collection"); 
      var menu = sender as MenuFlyoutSubItem; 
      menu.Items.Clear(); 
      foreach (var item in e.NewValue as List<MenuFlyoutItem>) menu.Items.Add(item); 
     })); 
} 

public sealed partial class MainPage : Page,INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 

    public List<MenuFlyoutItem> Options { get; set; } = new List<MenuFlyoutItem> 
    { 
     new MenuFlyoutItem {Text="Start item" }, 
     new MenuFlyoutItem {Text="Start item" }, 
     new MenuFlyoutItem {Text="Start item" } 
    }; 

    public MainPage() 
    { 
     this.InitializeComponent(); 
     DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Options = new List<MenuFlyoutItem> { new MenuFlyoutItem { Text = "Modified" } }; 
     RaiseProperty(nameof(Options)); 
//  mysub.Items.Add(new MenuFlyoutItem { Text = "modified" }); // even this cannot be done 
    } 
} 

Может быть, вы можете играть с некоторыми шаблонами, связывается в кнопке, а затем обменять все выпадающие, или попробовать что-то другое

+0

не существует способа редактировать или создавать что-то вроде этого? – shady

+0

@shady Я изменил ответ, чтобы показать дополнительную информацию. Это не решает проблему, но, возможно, даст вам несколько советов. – Romasz

+0

Спасибо, я смог изменить ваш пример, чтобы сделать то, что я хотел. вместо того, чтобы придать новое значение элементу меню, я перечислил его в список моей модели, чтобы я мог сопоставить значение свойства с текстовым свойством новых пунктов меню. – shady

Смежные вопросы