Привязка свойства IsEnabled в GridControl.View

Я пытаюсь связать IsEnabled свойство в контекстном меню. Контекстное меню находится в Devexpress GridControl.View,

Я предполагаю, что проблема в DataContext. Барбатон предмет ищет недвижимость HasPermissionDelete в DataContext сетки. Но это не дата-текст модели представления. Моя собственность HasPermissionDelete находится на ViewModel.

Я использую caliburn.micro.

Можете ли вы помочь мне исправить это связывание?

Мой код xaml:

<dxg:GridControl.View>
    <dxg:TableView x:Name="gridTable" AllowSorting="True" NavigationStyle="Row" MultiSelectMode="Row" AutoWidth="True" AllowEditing="False" AllowFilterEditor="True" AllowDrop="True" AllowGrouping="True" ShowGroupPanel="False" AllowMoveColumnToDropArea="True" SelectedRowsSource="{Binding SelectedUsers}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="RowDoubleClick">
                <cal:ActionMessage MethodName="Edit" />
            </i:EventTrigger>

            <i:EventTrigger EventName="Loaded">
                <cal:ActionMessage MethodName="InitializePrintableSource" >
                    <cal:Parameter Value="{Binding ElementName=gridTable}"></cal:Parameter>
                </cal:ActionMessage>
            </i:EventTrigger>
        </i:Interaction.Triggers>

        <dxg:TableView.RowCellMenuCustomizations>
            <dxb:BarButtonItem x:Name="btnDelete" Content="{lex:LocText Translations:Delete, Assembly=Prosa.Common.Modules.UserManagement}" IsEnabled="{Binding Path=HasPermissionDelete}"/>
        </dxg:TableView.RowCellMenuCustomizations>
    </dxg:TableView>
</dxg:GridControl.View>

1 ответ

Решение

Даже если вы используете Caliburn Micro, вы все равно можете вернуться к стандартному связыванию XAML. Я сделаю предположение, что ваша DevExpress DataGrid находится внутри простой Grid, которая является корневым элементом вашей страницы или UserControl. Итак, у вас будет что-то вроде этой структуры:

<Grid x:Name="root">

      <dxg:GridControl>
       ...
       (your GridControl.View and everything else here)
       ...
      </dxg:GridControl>
</Grid>

Таким образом, чтобы избежать использования DataContext GridControl в вашей кнопке, вы можете привязать к DataContext вашей корневой сетки, который в этом случае будет соответствующим ViewModel. Свяжите свою кнопку следующим образом:

<dxb:BarButtonItem x:Name="btnDelete" Content="{lex:LocText Translations:Delete, Assembly=Prosa.Common.Modules.UserManagement}" 
IsEnabled="{Binding ElementName=root, Path=DataContext.HasPermissionDelete}"/>

Таким образом, вы всегда можете получить доступ к нужному текстовому тексту, задав имя элемента (в данном примере "root"), а затем ссылаясь на него в привязке. Вы также можете привязать элементы без имени, но выражение привязки намного сложнее (вы должны использовать RelativeSource и выбрать тип элемента).

Надеюсь, что это решит вашу проблему!

Другие вопросы по тегам