【问题标题】:Toggling MenuItem visibility to a GridControl's SelectedItem切换 MenuItem 对 GridControl 的 SelectedItem 的可见性
【发布时间】:2020-03-05 08:55:58
【问题描述】:

我的 WPF 上有一个 GirdControl,它绑定到 NoteFrontEnd 类型的对象。在NoteFrontEnd 中有一个名为NoteType 的属性,我想将其用作MenuItem 中可见性绑定的来源。

用户必须右键单击GridControl 中的NoteFrontEnd 对象之一,并根据其NoteType 属性,使用Header="Process Item" 显示或隐藏MenuItem

GridControlMenuItem 在 xaml 中定义为:

<dxg:GridControl Name="GridCtrl"
                    ItemsSource="{Binding Path=BaseDashboardDataSource}"
                    SelectedItems="{Binding SelectedItems, Mode=TwoWay}"
                    AutoGenerateColumns="None">
    <dxg:GridControl.Columns>
        ...
        <dxg:GridColumn x:Name="NoteType"  FieldName="NoteType" Header="Type" />
    </dxg:GridControl.Columns>
    <dxg:GridControl.View>
            <dxg:TableView.ContextMenu>
                <ContextMenu>
                    <ContextMenu.ItemsSource>
                        <CompositeCollection>

                            ...

                            <!--Menu Item to toggle visibility of-->
                            <MenuItem Header="Process Item"
                                    Visibility="{Binding ElementName=GridCtrl, Path=SelectedItem, Converter={StaticResource GVItemToVis}}"     
                                        Command="{...}">
                            </MenuItem>

                        </CompositeCollection>
                    </ContextMenu.ItemsSource>
                </ContextMenu>
            </dxg:TableView.ContextMenu>
        </dxg:TableView>
    </dxg:GridControl.View>
</dxg:GridControl>

我的 ViewModel 是这样定义的:

public class NoteViewModel : DashboardViewModelBase
{
    ...
    public ObservableCollection<NoteFrontEnd> BaseDashboardDataSource { get; private set; }

    public ObservableCollection<BrokerNoteFrontEnd> SelectedItems
    {
        get { return _selectedItems; }
        set
        {
            if (_selectedItems == value) return;
            _selectedItems = value;
            OnPropertyChanged();
        }
    }

    public NoteViewModel(...) {
        ...
        BaseDashboardDataSource = new ObservableCollection<NoteFrontEnd>();
    }
}

NoteFrontEnd 一样:

public class NoteFrontEnd
{
    public string NoteType { get; set; }
}

我收到以下错误:

Cannot find source for binding with reference 'ElementName=GridCtrl'. BindingExpression:Path=SelectedItems;...

我尝试过类似下面的其他绑定,但得到了同样的错误:

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Grid}, Path=PlacementTarget.SelectedItem, Converter={StaticResource GVItemToVis}}"

我怎样才能让这个绑定起作用?

【问题讨论】:

    标签: c# wpf xaml binding


    【解决方案1】:

    上下文菜单是一个单独的窗口。它与您的网格控件位于不同的名称范围内。

    我建议你:

    将上下文菜单与每个 NoteFrontEnd 所在的行相关联,而不是与整个网格相关联。

    NoteFrontEnd 应该是一个实现 inotifypropertychanged 的​​视图模型。即使您没有想要通知的更改。始终绑定到实现 inpc 的对象,并避免绑定导致内存泄漏的可能性。

    这意味着您可以使用以下内容或变体访问该行的数据上下文:

         <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
    

    这意味着 datacontext 指向被模板化到点击行中的注释。

    然后你可以在你的 NoteFrontEnd 中输入一个命令来做任何应该做的事情。

    您还可以将此菜单项的可见性绑定到基于前端并封装您的逻辑的属性。

    我建议您(相反)考虑使用 icommand 的 canexecute 部分,并在用户不应该单击此选项时返回 false。这样,该条目仍会出现在上下文菜单中,但已禁用并显示为灰色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2013-08-05
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多