самореферентный файл xaml - PullRequest
1 голос
/ 17 декабря 2010

Я использую шаблон ViewModel Model View в своем приложении WPF. DataContext моего представления установлен на ViewModel.

У меня есть ListView в моем представлении, в котором есть ContextMenu, и один из MenuItems должен быть привязан к команде, а CommandParameter - это сам ListView.

Теперь моя проблема в том, что я не знаю, как ссылаться на ListView. Может быть, фрагмент кода облегчает понимание:

<ListView 
            Name="lvTestList"
            ItemsSource="{Binding Path=TestList.Items}">

            <!-- Context Menu of the selected test -->
            <ListView.ContextMenu>
                <ContextMenu>
                    <MenuItem
                        Header="Remove from List"
                        IsEnabled="{Binding IsATestSelected}" 
                        Command="{Binding RemoveTestFromTestListCommand}" 
                        CommandParameter="{Binding ElementName=lvTestList}"/>
                </ContextMenu>
            </ListView.ContextMenu>

            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding TestName}"/>
                    <GridViewColumn Header="Package" DisplayMemberBinding="{Binding PackageName}"/>
                    <GridViewColumn Header="Expected Duration" DisplayMemberBinding="{Binding ExpectedDuration}"/>
                </GridView>
            </ListView.View>
        </ListView>

Проблемная строка гласит:

CommandParameter="{Binding ElementName=lvTestList}"/>

Обычно это будет работать. Однако, если DataContext всего класса изменяется, он просто передает значение null в качестве параметра.

Кто-нибудь знает, как сохранить ссылку на текущий документ xaml? или как "поговорить" с ListView "lvTestList" напрямую?

С наилучшими пожеланиями и спасибо за помощь, Christian

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Использование Self Binding:

CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Parent.PlacementTarget.Name}"

Устанавливает значение CommandParameter в "lvTestList".

Вы также можете использовать Ancestor Binding:

CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Name}"

InВ этих примерах PlacementTarget будет элементом управления, на котором был открыт ContextMenu.В вашем случае это будет ListView.

1 голос
/ 17 декабря 2010

Вы можете получить ссылку на свой ListView с помощью привязки Relativeource FindAncestor:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}

Кажется немного странным, что вы хотите передать ListView в качестве параметра команде, возможно, вам следует использовать:

{Binding Path=DataContext.Something, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}

С указанием пути к DataContext вы можете связать модель родительского представления.

Надеюсь, это поможет, Колин Э.

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