Проблема с ActivateItem контекстным меню на сетке данных с использованием CaliburnMicro

#c# #wpf #mvvm

Вопрос:

Дамы и Господа,

У меня есть проблема, над которой я работаю уже несколько дней. Я кратко расскажу о том, что происходит. Я использую caliburn micro в своем проекте. До сих пор у меня не было проблем с ActivateItemAsync. Однако теперь этот метод не активирует мой элемент ActiveItem. Теперь, как выглядит мой код: у меня есть DashboardMainView:

  <Grid >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Ribbon ...>
    </Ribbon>
    <Grid Grid.Row="1" Background="#E8E8E8">
        <ContentControl x:Name="ActiveItem"  HorizontalAlignment="Stretch" 
                        VerticalAlignment="Stretch">
        </ContentControl>
    </Grid>
 

Затем в dashboardmainviewмодель:

 public class DashboardMainViewModel : Conductor<object>
{
    private IDialogCoordinator dialogCoordinator;

    public DashboardMainViewModel(IDialogCoordinator instance)
    {
        this.dialogCoordinator = instance;
        ActivateItemAsync(new DashboardSummaryViewModel());
    }
    public async Task Execution()
    {
        await ActivateItemAsync(new BasicExecutionViewModel(DialogCoordinator.Instance));
    }
 

Пока все работает, но затем активируется BasicExecutionView, в котором у меня есть сетка данных и менуконтекст. И вот тут возникает проблема, когда мы щелкаем правой кнопкой мыши по сетке данных, появляется меню, в котором после выбора интересного варианта следует активировать другое представление … но это не так. Мой код выглядит так:

 <Grid >
    <Viewbox Stretch="Fill">
    <DataGrid 
        x:Name="BasicExecutionGrid"
        CanUserSortColumns="True"
        IsReadOnly="True"
        CanUserAddRows="False"
        FontSize="11"
        Height ="800"
        ScrollViewer.CanContentScroll="True" 
        ScrollViewer.VerticalScrollBarVisibility="Auto"
        ScrollViewer.HorizontalScrollBarVisibility="Auto" AutoGeneratingColumn="BasicExecutionGrid_AutoGeneratingColumn">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="DataGridColumnHeader">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock TextWrapping="Wrap"
                                       Text="{Binding}" 
                                       HorizontalAlignment="Center" 
                                       VerticalAlignment="Center"></TextBlock>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="HorizontalContentAlignment" Value="Center" />
                <Setter Property="Background" Value="LightSteelBlue"/>
                <Setter Property="FontSize" Value="12"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="Height" Value="45"/>
            </Style>
        </DataGrid.ColumnHeaderStyle>
            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Details" 
                              Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=DataContext.ActivateCellDetailsView}"
                              >
                    </MenuItem>
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>
    </Viewbox>
</Grid>
 

In BasicExecutionViewModel I have:

     class BasicExecutionViewModel : Conductor<object>
{
    private IDialogCoordinator dialogCoordinator;


    private RelayCommand activateCellDetailsView { get; set; }

    public BasicExecutionViewModel(IDialogCoordinator instance)
    {
        this.dialogCoordinator = instance;
    }

    public ICommand ActivateCellDetailsView
    {
        get
        {
            if (activateCellDetailsView == null)
            {
                activateCellDetailsView = new RelayCommand(async p=> await ActivateCellView());
            }
            return activateCellDetailsView;
        }
    }
    public async Task ActivateCellView()
    {
        await ActivateItemAsync(new CellDetailsExecutionViewModel());
    }
}
 

The code comes to ActivateCellView () and activates it. I can see it in Output Window where ActiveItem takes the value of the CellDetailsExecutionViewModel () object, but BasicExecutionView is still displayed on the screen. What am I doing wrong? I guess it’s something with either DataContext or parent-child issue … please help 🙂

ps. I’m not a professional programmer I’m a hobbyist… and forgive me for my English

Edit

I solved the problem. My mistake was using Conductor incorrectly
In DashboardMainViewModel. When i corrected on

 DashboardMainViewModel: Conductor<object>.Collection.OneActive
 

ant the same in the BasicExecutionViewModel

 BasicExecutionViewModel: Conductor<object>.Collection.OneActive
 

I also updated the code in the ActivateCellView() method to

         public async Task ActivateCellView()
    {
        CellDetailsExecutionViewModel cellDetailsExecutionViewAcvtivate = new CellDetailsExecutionViewModel();
        var parentConductor = (Conductor<object>.Collection.OneActive)(this.Parent);
        await parentConductor.ActivateItemAsync(cellDetailsExecutionViewAcvtivate);
    }
 

И все работает прекрасно