Переключение видимости MenuItem в SelectedItem элемента GridControl - PullRequest
0 голосов
/ 05 марта 2020

У меня есть GirdControl на моем WPF, который связан с объектами типа NoteFrontEnd. В NoteFrontEnd есть свойство с именем NoteType, которое я хочу использовать в качестве источника привязки видимости в MenuItem.

Пользователь должен щелкнуть правой кнопкой мыши один из NoteFrontEnd объектов из GridControl, и на основе его свойства NoteType либо показать, либо скрыть MenuItem с помощью Header="Process Item". * 1013. *

GridControl и MenuItem определены в 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}}"

Как можно Я получаю эту привязку на работу?

1 Ответ

0 голосов
/ 05 марта 2020

Контекстное меню - это отдельное окно. Он находится в другой области имен, чем ваш gridcontrol.

Я предлагаю вам:

Свяжите контекстное меню со строкой, в которой находится каждый NoteFrontEnd, а не со всей сеткой.

NoteFrontEnd должен быть моделью представления, которая реализует inotifypropertyolated. Даже если у вас нет изменений, о которых вы хотите сообщить. Всегда привязывать к объекту реализует inp c и избегать возможности утечки памяти из-за привязок.

Это означает, что вы можете получить доступ к тексту данных этой строки, используя либо приведенный ниже вариант, либо вариант:

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

Это означает, что текстовый указатель указывается на заметку, которая помещается в строку, по которой щелкнули.

Затем вы можете поместить команду в свой NoteFrontEnd, чтобы выполнить все, что предполагается.

Вы также можете связать видимость этого пункта меню со свойством, которое основано на внешнем интерфейсе и инкапсулирует, какой бы ни была ваша логика c.

Я предлагаю вам (вместо этого) рассмотреть возможность использования части canexecute в icommand и вернуть false когда пользователь не должен нажимать эту опцию. Таким образом, запись все равно будет присутствовать в контекстном меню, но отключена и будет серой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...