C# 绑定并更新ObservableCollection<;T>;到MenuFlyOut子项
我正在Visual Studio 2015中开发UWP(通用Windows平台)应用程序。我目前面临的问题是,我想将项目添加到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
菜单中。基本上,这些项目是一组播放列表
我的问题是:
如何将可观察集合
或列表
绑定到菜单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; }