Jak wrócić do poprzedniego DataContext?

0

W poniższym kodzie starałam się wyłuszczyć sedno problemu. TextBlock "ItemName" wyświetla się prawidłowo, za to w drugim MenuItem nie wyświetla się Header. Jak rozumiem, to zmiana DataContext wpływa na to, że nie mamy dostępu do ItemName... Jak wrócić do poprzedniego DataContext? ItemName jest polem klasy DocumentItem. Próbowałam różnych kombinacji z RelativeSource Self, ale nic mi nie działa.

Szerszy kontekst - jesteśmy w ListView, a to jest xaml opisujący ListViewItem. Komendy pochodzą z ViewModelu, a elementy ListView to lista znajdująca się w ViewModelu. Wykorzystuję MVVM Light.

<DataTemplate x:Key="SelectedItemDataTemplate" DataType="{x:Type common:DocumentItem}">
    <Grid HorizontalAlignment="Stretch" x:Name="Root">
        <TextBlock x:Name="ItemName" Text="{Binding ItemName}"></TextBlock>
        <StackPanel x:Name="Buttons">                
            <ToggleButton x:Name="OptionsButton" 
                          DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext}"
                          Style="{StaticResource DefaultToggleButton}">
                <Grid>
                    <Popup x:Name="OptionsPopup"
                           PlacementTarget="{Binding ElementName=OptionsButton}" 
                           IsOpen="{Binding ElementName=OptionsButton, Path=IsChecked, Mode=OneWay}"
                           DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
                        <StackPanel>
                            <MenuItem x:Name="InsertText"
                                      Header="Insert text" 
                                      Command="{Binding InsertTextCommand}">
                            </MenuItem>

                            <MenuItem x:Name="SomethingElse"
                                      Header="{Binding ItemName}" 
                                      Command="{Binding DoSomethingElseCommand}">
                            </MenuItem>
                        </StackPanel>
                    </Popup>
                </Grid>
            </ToggleButton>
        </StackPanel>
    </Grid>
</DataTemplate>
3

Używa się techniki która się zowie Proxy, tutaj jest opisana:
https://thomaslevesque.com/20[...]datacontext-is-not-inherited/
powinna pomóc Ci się pozbyć potrzeby bindowania kontekstu po FindAncestor, w ogólności powiedziałbym że używanie FindAncestor jest złą praktyką i oznacza kłopoty.

0

Coś mi niestety nie wychodzi -_-'
Stworzyłam klasę, dodałam ją w Grid.Resources, ale nie umiem jej użyć:

Próbowałam tak:

<MenuItem Header="{Binding Thesises.Count}" DataContext="{StaticResource proxy}" />

Nic się nie wyświetla.

Próbowałam też tak:

<MenuItem Header="{Binding Path=Thesises.Count, RelativeSource={StaticResource proxy}}" />

Rzuca wyjątek: InvalidCastException: Nie można rzutować obiektu typu 'LexEdytor.UI.TaskPanes.Links.BindingProxy' na typ 'System.Windows.Data.RelativeSource'.

2
aurel napisał(a):
<MenuItem Header="{Binding Path=Thesises.Count, RelativeSource={StaticResource proxy}}" />

binding raczej powinien wyglądać tak:

<MenuItem Header="{Binding Path=Data.Thesises.Count, Source={StaticResource proxy}}" />
0

Prawie, prawie! :D

Obecny kod:

<StackPanel>
    <TextBlock Text="{Binding Path=Data.Thesises.Count, Source={StaticResource proxy}}" Background="Red"/>
    <MenuItem Header="{Binding Path=Data.Thesises.Count, Source={StaticResource proxy}}" Background="Green"/>

    <MenuItem x:Name="InsertText"
              Header="Insert text">
        <MenuItem>
            <TextBlock Text="{Binding Path=Data.Thesises.Count, Source={StaticResource proxy}}" Background="Yellow"/>
        </MenuItem>
        <MenuItem Header="{Binding Path=Data.Thesises.Count, Source={StaticResource proxy}}" Background="Blue"/>
    </MenuItem> 
</StackPanel>

I teraz tak:

  1. Czerwony TextBlock wyświetla się i pokazuje liczbę Thesises.Count
  2. Zielony MenuItem wyświetla się na zielono, ale nie pokazuje żadnej liczby
  3. Żółty TextBlock nie wyświetla się (widać pozycję w submenu, ale nie jest ona żółta i nie ma żadnej liczby)
  4. Niebieski MenuItem wyświetla się na niebiesko, ale nie wyświetla żadnej liczby.

TextBlock w submenu próbowałam dodać też bez otaczającego go MenuItem, ale efekt był ten sam...

Tak dodam jeszcze, że moim ostatecznym celem jest zrobienie tyle MenuItem w submenu, ile mamy Thesises.Count, jak również podpięcie pod nie komendy z ViewModelu z parametrem na podstawie indeksu w Thesises... Ale założyłam, że najpierw trzeba w ogóle jakoś zrobić prawidłowy Binding, zanim przejdę do następnych kroków ;)

1

Problem jest raczej w tym że używasz menuitemów poza kontrolką ContextMenu:

<TextBlock Text="{Binding Path=Data.Count, Source={StaticResource proxy}}" Background="Red" Width="124">
            <TextBlock.ContextMenu>
                <ContextMenu >
                    <TextBlock Text="{Binding Path=Data.Count, Source={StaticResource proxy}}" Background="Red"/>
                    <MenuItem Header="{Binding Path=Data.Count, Source={StaticResource proxy}}" Background="Green"/>

                    <MenuItem x:Name="InsertText"
              Header="Insert text">
                        <MenuItem>
                            <TextBlock Text="{Binding Path=Data.Count, Source={StaticResource proxy}}" Background="Yellow"/>
                        </MenuItem>
                        <MenuItem Header="{Binding Path=Data.Count, Source={StaticResource proxy}}" Background="Blue"/>
                    </MenuItem>
                </ContextMenu>
            </TextBlock.ContextMenu>
        </TextBlock>

title

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0