Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定并更新ObservableCollection<;T>;到MenuFlyOut子项_C#_.net_List_Uwp_Observablecollection - Fatal编程技术网

C# 绑定并更新ObservableCollection<;T>;到MenuFlyOut子项

C# 绑定并更新ObservableCollection<;T>;到MenuFlyOut子项,c#,.net,list,uwp,observablecollection,C#,.net,List,Uwp,Observablecollection,我正在Visual Studio 2015中开发UWP(通用Windows平台)应用程序。我目前面临的问题是,我想将项目添加到菜单中。基本上,这些项目是一组播放列表 我的问题是: 如何将可观察集合或列表绑定到菜单OutSubItem并在添加新项目时更新项目?我已经在这里试过了: 公共静态类菜单扩展 { 公共静态列表GetMyItems(DependencyObject obj) {return(List)obj.GetValue(MyItemsProperty);} 公共静态无效SetMyIte

我正在Visual Studio 2015中开发UWP(通用Windows平台)应用程序。我目前面临的问题是,我想将项目添加到
菜单中。基本上,这些项目是一组播放列表

我的问题是: 如何将
可观察集合
列表
绑定到
菜单OutSubItem
并在添加新项目时更新项目?我已经在这里试过了:

公共静态类菜单扩展
{
公共静态列表GetMyItems(DependencyObject obj)
{return(List)obj.GetValue(MyItemsProperty);}
公共静态无效SetMyItems(DependencyObject对象,列表值)
{obj.SetValue(MyItemsProperty,value);}
公共静态只读从属属性MyItemsProperty=
DependencyProperty.Register(“MyItems”)、typeof(List)、typeof(MenuExtension),
新属性元数据(新列表(),(发件人,e)=>
{
Debug.WriteLine(“填充集合”);
var menu=发送方作为MENUFLYOUT子项;
menu.Items.Clear();
foreach(e.NewValue中的var项作为列表)菜单.Items.Add(项);
}));
}

只要项目不发生变化,这是很好的,但在我的场景中,
项目
将发生变化。如何将更新添加到此扩展?如果在每个弹出窗口上再次创建弹出按钮,则它将更新,但我不知道如何实现此行为

我们将非常感谢您的帮助,谢谢

如果在每个弹出窗口上再次创建弹出按钮,则它将更新,但我不知道如何实现此行为

你说得对,我删除了
菜单中的所有项,然后再次添加它们。弹出按钮也会更新。直接更新
MenuFlyoutSubItem
的子项不会对表面产生任何影响

为此,您可以修改如下代码:

  • 将项目绑定到XAML中的
    MenuFlyout
    而不是
    MenuFlyoutSubItem

    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" VerticalAlignment="Center">
            <Button Content="click" Name="myBtn">
                <Button.Flyout>
                    <MenuFlyout local:FlyoutMenuExtension.MyItems="{Binding OptionItems}">
                    </MenuFlyout>
            </Button.Flyout>
        </Button>
        <Button Content="modify" Click="Button_Click"/>
    </StackPanel>
    
  • 修改
    菜单扩展

    public static class FlyoutMenuExtension
    {
        public static List<MenuFlyoutItemBase> GetMyItems(DependencyObject obj)
        {
            return (List<MenuFlyoutItemBase>)obj.GetValue(MyItemsProperty);
        }
        public static void SetMyItems(DependencyObject obj, List<MenuFlyoutItemBase> value)
        {
            obj.SetValue(MyItemsProperty, value);
        }
        public static readonly DependencyProperty MyItemsProperty =
            DependencyProperty.Register("MyItems",
                typeof(List<MenuFlyoutItemBase>),
                typeof(FlyoutMenuExtension),
                new PropertyMetadata(new List<MenuFlyoutItemBase>(), (sender, e) => {
                    var menu = sender as MenuFlyout;
                    menu.Items.Clear();
                    foreach (var item in e.NewValue as List<MenuFlyoutItemBase>)
                    {
                        menu.Items.Add(item);
                    }
                }));
    }
    
    公共静态类弹出菜单扩展
    {
    公共静态列表GetMyItems(DependencyObject obj)
    {
    返回(列表)对象获取值(MyItemsProperty);
    }
    公共静态无效SetMyItems(DependencyObject对象,列表值)
    {
    对象设置值(MyItemsProperty,value);
    }
    公共静态只读从属属性MyItemsProperty=
    DependencyProperty.Register(“MyItems”,
    类型(列表),
    类型(弹出菜单扩展),
    新属性元数据(新列表(),(发件人,e)=>{
    var menu=发送方为MenuFlyout;
    menu.Items.Clear();
    foreach(e.NewValue中的变量项作为列表)
    {
    菜单.项目.添加(项目);
    }
    }));
    }
    
  • 以下是完整的演示:

    如果在每个弹出窗口上再次创建弹出按钮,则它将更新,但我不知道如何实现此行为

    你说得对,我删除了
    菜单中的所有项,然后再次添加它们。弹出按钮也会更新。直接更新
    MenuFlyoutSubItem
    的子项不会对表面产生任何影响

    为此,您可以修改如下代码:

  • 将项目绑定到XAML中的
    MenuFlyout
    而不是
    MenuFlyoutSubItem

    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" VerticalAlignment="Center">
            <Button Content="click" Name="myBtn">
                <Button.Flyout>
                    <MenuFlyout local:FlyoutMenuExtension.MyItems="{Binding OptionItems}">
                    </MenuFlyout>
            </Button.Flyout>
        </Button>
        <Button Content="modify" Click="Button_Click"/>
    </StackPanel>
    
  • 修改
    菜单扩展

    public static class FlyoutMenuExtension
    {
        public static List<MenuFlyoutItemBase> GetMyItems(DependencyObject obj)
        {
            return (List<MenuFlyoutItemBase>)obj.GetValue(MyItemsProperty);
        }
        public static void SetMyItems(DependencyObject obj, List<MenuFlyoutItemBase> value)
        {
            obj.SetValue(MyItemsProperty, value);
        }
        public static readonly DependencyProperty MyItemsProperty =
            DependencyProperty.Register("MyItems",
                typeof(List<MenuFlyoutItemBase>),
                typeof(FlyoutMenuExtension),
                new PropertyMetadata(new List<MenuFlyoutItemBase>(), (sender, e) => {
                    var menu = sender as MenuFlyout;
                    menu.Items.Clear();
                    foreach (var item in e.NewValue as List<MenuFlyoutItemBase>)
                    {
                        menu.Items.Add(item);
                    }
                }));
    }
    
    公共静态类弹出菜单扩展
    {
    公共静态列表GetMyItems(DependencyObject obj)
    {
    返回(列表)对象获取值(MyItemsProperty);
    }
    公共静态无效SetMyItems(DependencyObject对象,列表值)
    {
    对象设置值(MyItemsProperty,value);
    }
    公共静态只读从属属性MyItemsProperty=
    DependencyProperty.Register(“MyItems”,
    类型(列表),
    类型(弹出菜单扩展),
    新属性元数据(新列表(),(发件人,e)=>{
    var menu=发送方为MenuFlyout;
    menu.Items.Clear();
    foreach(e.NewValue中的变量项作为列表)
    {
    菜单.项目.添加(项目);
    }
    }));
    }
    

  • 以下是完整的演示:

    我尝试了@Elvis Xia-MSFT建议的方法,尽管它对我不起作用,但它向我展示了解决方案的方法。我在一个自动生成的.cs文件中遇到一个编译错误(使用x:Bind),说它无法从MenuFlyout转换到FrameworkElement。当我改用“Binding”时,我成功地编译了,但是菜单没有更新。所以,我所做的只是将依赖属性提升一级(或者2个级别,如果你考虑<代码> <代码>),按钮本身:

    <Button local:ButtonExtension.MenuFlyout="{x:Bind MainViewModel.Menu, Mode=OneWay}"/>
    
    以下是ViewModel中的属性:

    public MenuFlyout Menu { get; private set; }
    

    我尝试了@Elvis Xia-MSFT的建议,虽然它对我不起作用,但它为我指明了解决方法。我在一个自动生成的.cs文件中遇到一个编译错误(使用x:Bind),说它无法从MenuFlyout转换到FrameworkElement。当我改用“Binding”时,我成功地编译了,但是菜单没有更新。所以,我所做的只是将依赖属性提升一级(或者2个级别,如果你考虑<代码> <代码>),按钮本身:

    <Button local:ButtonExtension.MenuFlyout="{x:Bind MainViewModel.Menu, Mode=OneWay}"/>
    
    以下是ViewModel中的属性:

    public MenuFlyout Menu { get; private set; }