WPF延迟绑定上下文菜单项源

时间:2017-06-22 18:24:48

标签: c# wpf mvvm contextmenu caliburn.micro

我成功将MenuModel绑定到MenuItem.ItemsSource。但是,这些项目应该是背景化的。现在,我填充了ViewModel集合,数据已准备好绑定到项目源,但这并未涵盖我的所有场景。

我需要在上下文菜单打开时重新填充ViewModel集合,也就是说,我的目标是仅在上下文菜单打开时填充集合,因为之前没有意义(项目应该是上下文化的) by ListBox SelectedItem)。

XAML

<Style x:Key="ActionMenuItemStyle" TargetType="MenuItem" BasedOn="{StaticResource MetroMenuItem}">
    <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />
    <Setter Property="Icon" Value="{StaticResource ActionMenuItemIcon}" />
    <Setter Property="IsCheckable" Value="{Binding IsCheckable, Mode=OneWay}" />
    <Setter Property="IsChecked" Value="{Binding IsChecked, Mode=OneWay}" />
    <Setter Property="Command" Value="{Binding Action}" />
    <Setter Property="CommandParameter" Value="{Binding ActionParameter}" />
</Style>

<HierarchicalDataTemplate DataType="{x:Type model:MenuModel}" ItemsSource="{Binding Children}">
    <MenuItem Header="{Binding Path=Header}" Style="{StaticResource ActionMenuItemStyle}"
                      UsesItemContainerTemplate="True" ItemContainerTemplateSelector="{StaticResource ActionMenuItemContainerTemplateSelector}"/>
</HierarchicalDataTemplate>

<DataTemplate DataType="{x:Type model:SeparatorMenuModel}">
    <Separator Style="{StaticResource {x:Static MenuItem.SeparatorStyleKey}}"/>
</DataTemplate>

<ContextMenu x:Key="OneItem">
            <MenuItem Header="{x:Static resx:StudioResources.Advanced}">

                <MenuItem Header="{x:Static resx:StudioResources.MoveToRoutineMenu}"
                          ItemsSource="{Binding PlacementTarget.Tag.Routines, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"
                          UsesItemContainerTemplate="True" 
                          ItemContainerTemplateSelector="{StaticResource ActionMenuItemContainerTemplateSelector}"/>
            </MenuItem>
        </ContextMenu>

视图模型

public IObservableCollection<IMenuModel> Routines { get; private set; }
protected override void OnViewLoaded(object view)
    {
        base.OnViewLoaded(view);

        GetParent().Routines.CollectionChanged += (s, e) =>
        {
            Routines.Clear();
            var names = GetParent().Routines.Where(r => r != GetParent().ActiveRoutine).Take(5).OrderBy(r => r);
            var menus = names.Select(name => new MenuModel(name, new MenuAction<string>(MoveToRoutine), name)).ToList();
            menus.ForEach(m => m.WithEditor(GetParent()));
            Routines.AddRange(menus);
        };
    }

我听一个事件重新填充集合,但实际上我需要听其他几个事件,我想知道是否有一个干净的方式,比如填充上下文菜单。

0 个答案:

没有答案