Привязка WPF к ListView SelectedItem не работает - PullRequest
0 голосов
/ 06 августа 2011

Я использую ListView для отображения содержимого журнала в моем приложении.Я хочу изменить значок и видимость контекстного MenuItem на основе выбранной в данный момент записи пользователя в ListView.

Вот как я заполняю ListView:

// Create the collection view source.
m_CollectionViewSource = new CollectionViewSource();                
m_CollectionViewSource.SortDescriptions.Add(new System.ComponentModel.SortDescription("Time", System.ComponentModel.ListSortDirection.Descending));
m_CollectionViewSource.Filter += new FilterEventHandler(LogEventCollectionViewSource_Filter);

// Create the binding.
Binding binding = new Binding();
binding.Source = m_CollectionViewSource;
this.LogEventListView.SetBinding(ListView.ItemsSourceProperty, binding);
m_CollectionViewSource.Source = LogEventManager.Instance.LogEventCollection;

И вотЗдесь я создаю свой элемент управления ListView.

    <ListView x:Name="LogEventListView" 
          Grid.Row="0"
          Grid.Column="0"
          SelectionMode="Single"
          VirtualizingStackPanel.IsVirtualizing="True">
    <ListView.ContextMenu>
        <ContextMenu Opened="ContextMenu_Opened">
            <MenuItem x:Name="ContextMenuViewDetails"
                      Header="View Details..."
                      ToolTip="Shows all of the data associated with the log event message."
                      Visibility="{Binding ElementName=LogEventListView, Path=SelectedItem, Converter={StaticResource NullToVisibilityConverter}}">
                <MenuItem.Icon>
                    <Image MaxHeight="16" MaxWidth="16" Source="{Binding ElementName=LogEventListView, Path=SelectedItem.Category, Converter={StaticResource LogEventCategoryConverter}, ConverterParameter='Small'}" />
                </MenuItem.Icon>
            </MenuItem>

Все работает нормально, кроме привязки первого пункта меню.Когда элемент не выбран, я хочу, чтобы видимость первого элемента меню была свернута.Я также хочу, чтобы контекстное изображение MenuItem соответствовало выбранному событию журнала.Я убедился, что ОБА из моих классов IValueConverter работают правильно.По какой-то причине первый MenuItem всегда виден и никогда не имеет иконки.Может кто-нибудь сказать мне, что я пропускаю?

ОБНОВЛЕНИЕ: Кажется, есть некоторые реальные проблемы со связыванием со свойством Icon элемента MenuItem в .NET 3.5, как видно здесь и здесь .Проблемы усугубляются тем, что я использую IValueConverter для выбора подходящего изображения.Хотя это не решение, которое я предпочитаю, на данный момент я просто решил установить значения в code-behind в событии открытия ContextMenu.

ContextMenu menu = sender as ContextMenu;

if (menu != null)
{
        MenuItem item = LogicalTreeHelper.FindLogicalNode(menu, "ContextMenuViewDetails") as MenuItem;

        if (item != null)
        {
            if (this.LogEventListView.SelectedItems.Count <= 0)
                item.Visibility = Visibility.Collapsed;
            else
                item.Visibility = Visibility.Visible;
            }
        }
}

Ответы [ 2 ]

0 голосов
/ 06 августа 2011

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

Исходный ответ ниже, но, вероятно, победилне работает

Не видя конвертер, я не могу прокомментировать, почему он может не работать, но вместо этого можно попробовать добиться того же с помощью стиля:

<ContextMenu.Style>
    <Style>
       <Style.Triggers>
           <DataTrigger Binding="{Binding SelectedItem, ElementName=LogEventListView} Value="{x:Null}">
              <Setter Property="Visibility" Value="Collapsed"/>
           </DataTrigger>
       </Style.Triggers>
     </Style>
 </ContextMenu.Style>
0 голосов
/ 06 августа 2011
<Image MaxHeight="16" MaxWidth="16" 
Source="{Binding ElementName=LogEventListView, 
Path=SelectedItem.Category, 
Converter={StaticResource LogEventCategoryConverter}, ConverterParameter='Small'}"/>

Я не могу найти прикрепленное свойство с именем Категория к SelectedItem ??

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