`ContextMenu` Привязка команды внутри` ListView.ItemContainerStyle` не работает - PullRequest
0 голосов
/ 28 января 2020

У меня есть представление списка, где я хотел скрыть ContextMenuItems на основе некоторого значения в столбце ListView. Я мог бы добиться этого, переместив ContextMenu в ListView.ItemContainerStyle. Теперь моя проблема в том, что я не могу запустить Команды на MenuItem. Раньше это работало, когда ContextMenu было установлено прямо на ListView.

Вот что я попробовал и потерпел неудачу. (Используется ElementType, ElementName, Прямой вызов и т. Д. c.).

 <UserControl Name="RootElement" DataContext=.Some Context.....>     
 <ListView ItemsSource="{Binding LicensesView}">
                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">
                        <Setter Property="ContextMenu">
                            <Setter.Value>
                                <ContextMenu>
                                    <MenuItem Header="Refresh 1" Command="{Binding Path=DataContext.LicenseListRefreshCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                                    <MenuItem Header="Refresg 2" Command="{Binding Path=DataContext.LicenseListRefreshCommand, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}"/>
                                    <MenuItem Header="Refresh 3" Command="{Binding Path= DataContext.LicenseListRefreshCommand, ElementName=RootElement}" Visibility="{Binding Path=Aktif,Converter= {StaticResource BoolToVisibility}}"/>
                                    <MenuItem Header="Refresh 4" Command="{Binding LicenseListRefreshCommand}"/>
                                </ContextMenu>
                            </Setter.Value>                           
                        </Setter>
                  </Style>
                </ListView.ItemContainerStyle>
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Code" DisplayMemberBinding="{Binding Code}" Width="Auto"/>
                        <GridViewColumn Header="Active" DisplayMemberBinding="{Binding Active}" Width="150" />
                        <GridViewColumn Header="Company" DisplayMemberBinding="{Binding Company}" Width="60" />
                        <GridViewColumn Header="Demo" DisplayMemberBinding="{Binding Demo}" Width="Auto" />
                    </GridView>
                </ListView.View>
            </ListView>
</UserControl>

1 Ответ

0 голосов
/ 28 января 2020

Причина, по которой он не работает, заключается в том, что Style является свойством Disconnected и, следовательно, не учитывает визуальное дерево. Я решил это с помощью связующего прокси, как показано в этот ответ .

Ключ должен добавить ссылку на DataContext как StaticResource.

<UserControl Name="RootElement" DataContext=.Some Context.....> 
 <UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisibility" />
    <helper:BindingProxy x:Key="Proxy" Data="{Binding}" />
</UserControl.Resources>    
<ListView ItemsSource="{Binding LicensesView}">
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ContextMenu">
                        <Setter.Value>
                            <ContextMenu>
                                <MenuItem Header="Refresh 1" Command="{Binding Path=Data.LicenseListRefreshCommand, Source={StaticResource Proxy}}" />
                            </ContextMenu>
                        </Setter.Value>                           
                    </Setter>
              </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Code" DisplayMemberBinding="{Binding Code}" Width="Auto"/>
                    <GridViewColumn Header="Active" DisplayMemberBinding="{Binding Active}" Width="150" />
                    <GridViewColumn Header="Company" DisplayMemberBinding="{Binding Company}" Width="60" />
                    <GridViewColumn Header="Demo" DisplayMemberBinding="{Binding Demo}" Width="Auto" />
                </GridView>
            </ListView.View>
        </ListView>

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