Команда WPF — утечка памяти

Я использую WPF 4 с шаблоном MVVM. У меня есть TabControl - это выглядит так:

 <TabControl x:Name="Items" ItemsSource="{Binding Screens}" 
                            SelectedItem="{Binding ActiveScreen}">
   <TabControl.ItemTemplate>
     <DataTemplate>
       <ContentControl>
            <Button Command="{Binding 
                              DataContext.ScreenCloseCommand, 
                              ElementName=MainWindow}" 
                    CommandParameter="{Binding}">X</Button>
       </ContentControl>
     </DataTemplate>
   </TabControl.ItemTemplate>

Проблема в том, что CommandParameter="{Binding}" содержит строгую ссылку на отображаемый в данный момент View/ViewModel. Как я могу удалить эту команду? Другими словами: мне нужен способ удалить команду кнопки из ItemTemplate, имея только ссылку на TabControl.ContentTemplate (ViewModel и View). Что-то вроде просмотра предметов, поиска предмета, удаления команды...

Спасибо, Майкл.


person user1011524    schedule 24.10.2011    source источник
comment
Как вы обнаружили, что эта команда вызывает утечку памяти?   -  person sll    schedule 25.10.2011


Ответы (1)


Я думаю, что вы смотрите не на ту проблему. Это не Binding, который поддерживает ViewModel. Это весь TabControl и коллекция, к которой он привязан.

Если вы описали реальную проблему, которую пытаетесь решить, а не решение, которое безуспешно пытаетесь использовать, мы могли бы помочь вам лучше.

person svick    schedule 25.10.2011
comment
Если я удаляю CommandParameter, он работает - ViewModel/View собирается. Чего я пытаюсь добиться: Закрываемые вкладки с MVVM. MainWindow — это моя оболочка, в которой есть метод ScreenCloseCommand. Этот метод запрашивает экран (который передается через CommandParameter), можно ли его закрыть (CanClose). Затем я удаляю его из привязанного к TabControl ObservableList - так что он исчезает ... Но из-за цикла привязки ссылка все еще жива из привязанной к кнопке команды -> утечка (imo) :-( - person user1011524; 25.10.2011
comment
Ты прав. При описанных вами обстоятельствах утечка действительно происходит. Я понятия не имею, как от него избавиться. - person svick; 25.10.2011