WPF Получить содержимое TextBlock внутри ListView при нажатии ContextMenu - PullRequest
0 голосов
/ 08 июня 2019

У меня есть ListView, который содержит TextBlocks. ListView имеет контекстное меню, и мне нужно получить свойство Content TextBlock при щелчке по контекстному меню.

Мне нужно получить «Документы и настройки» при нажатии кнопки «Загрузить» в контекстном меню. Я пробовал несколько решений, но все они приводят к исключению Null Reference. Спасибо!

1 Ответ

0 голосов
/ 10 июня 2019

Вот пример того, как я настраиваю ItemsControl для вызова команды и передачи элемента через параметр команды для выполнения некоторой работы с использованием MVVM Light.

<Window.Resources>
    <h:BindingProxy x:Key="proxy" Data="{Binding}"></h:BindingProxy>
</Window.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding MyData}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                     <ColumnDefinition></ColumnDefinition>
                     <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Remove Me" Command="{Binding Data.MyCommand, Source={StaticResource proxy}}" CommandParameter="{Binding}"></MenuItem>
                   </ContextMenu>
                </Grid.ContextMenu>
               <TextBlock Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding SomeField}"></TextBlock>
           </Grid>
       </DataTemplate>
    </ItemsControl.ItemTemplate>
 </ItemsControl>
 </Grid>

Я использую BindingProxy для привязки текстового окна к контекстному меню для получения команды, вот код для этого.

/// <summary>
/// BindingProxy
/// Used to get Parent datacontext within Child control.
/// </summary>
public class BindingProxy : Freezable
{
    #region " Overrides Of Freezable "
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }
    #endregion

    #region " Data "
    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }
    #endregion
}

Как видите, CommandParameter просто использует {Binding}, чтобы получить объект для строки ItemsSource, которая связана с ObservableCollection<SomeClass>.

Надеюсь, это даст вам некоторое представление о настройке контекстного меню для выполнения некоторой работы.

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