0

かなり複雑なデータ バインディング テンプレートがあり、 ViewModelに戻ってプロパティとコマンドにアクセスすることができません。

これは、私のxamlがレイアウトとしてからに設定されている方法です:

<HierarchicalDataTemplate x:Key="ChapterReferencesTemplate">
<StackPanel>
    <DockPanel>
        <TextBlock Text="Chapter Reference "/>
        <AccessText Text="{Binding Path=Chapter}" />
    </DockPanel>
    <DockPanel>
        <TextBlock Text="Total Reference Verses "/>
        <AccessText Text="{Binding Path=Verses}" />
    </DockPanel>
    <ListView Name="VerseReferencesListView" Height="200"
            ItemsSource="{Binding Path=VerseReferences}" 
            SelectedItem="{Binding Path=DataContext.CurrentVerseReference, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:CreateWritingsViewModel}}}"
            AlternationCount="2"
            BorderThickness="0"
            IsSynchronizedWithCurrentItem="True">
        <ListView.View>
            <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="xmlNamespace List" >
                <GridViewColumn 
                    Header="Verse" 
                    DisplayMemberBinding="{Binding Path=Verse}" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Width="Auto" TextAlignment="Left" Text="{Binding}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn 
                    Header="Query" 
                    DisplayMemberBinding="{Binding Path=Query}" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Width="Auto" TextAlignment="Left" Text="{Binding}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Actions">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Button 
                                Command="{Binding Path=DataContext.LookupReferencesCommand, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type src:CreateWritingsViewModel}}}" 
                                CommandParameter="{Binding .}" 
                                Template="{StaticResource AddButtonTemplate}"  Cursor="Hand" Width="30"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</StackPanel>

<HierarchicalDataTemplate x:Key="WritingsReferenceTemplate">

<Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="200"/>
    </Grid.ColumnDefinitions>

    <GroupBox Header="{Binding Path=Hebrew}">
        <StackPanel Margin="5 10 5 0">
            <StackPanel>
                <DockPanel>
                    <TextBlock Text="Writings of "/>
                    <AccessText Text="{Binding Path=Writings}" />
                </DockPanel>
                <DockPanel>
                    <TextBlock Text="Total Reference Chapters : "/>
                    <AccessText Text="{Binding Path=Chapters}" />
                </DockPanel>
                <DockPanel>
                    <TextBlock Text="Total Reference Verses : "/>
                    <AccessText Text="{Binding Path=Verses}" />
                </DockPanel>
                <DockPanel >
                    <TextBlock Text="Query for Writing : "/>
                    <AccessText Text="{Binding Path=QueryWriting}" />
                </DockPanel>
                <DockPanel >
                    <TextBlock Text="Query for Chapters : "/>
                    <AccessText Text="{Binding Path=QueryChapters}" />
                </DockPanel>
            </StackPanel>
            <DockPanel Margin="0 5 0 0">
                <GroupBox Header="Chapter References">
                    <Expander>
                        <ScrollViewer VerticalScrollBarVisibility="Auto" Height="200">
                            <HeaderedItemsControl
                                ItemTemplate="{StaticResource ChapterReferencesTemplate}"
                                ItemsSource="{Binding Path=ChapterReferences}"
                                Margin="10,0,0,0" />

                        </ScrollViewer>
                    </Expander>
                </GroupBox>
            </DockPanel>
        </StackPanel>
    </GroupBox>

</Grid>

<GroupBox Grid.Column="1" Header="CREATE REFERENCES">
<ListBox 
    Name="ReferenceListBox" 
    ItemTemplate="{StaticResource WritingsReferenceTemplate}"
    ItemsSource="{Binding Path=odsDocumentsService.WritingsReferenceItems}"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    VirtualizingStackPanel.IsVirtualizing="False"
    VirtualizingStackPanel.VirtualizationMode="Standard">
</ListBox>

私のHierarchicalDataTemplate x:Key="ChapterReferencesTemplate" では、既にItemsSource="{Binding Path=VerseReferences}"にバインドしていますが、 ListViewSelectedItemプロパティのViewModel の CurrentVerseReferenceにもバインドする必要があります。

ViewModel のLookupReferencesCommandに対するButton Commandについても同じです。すべてのデータは、 ObservableCollection ( ChapterReferencesVerseReferences )を含むオブジェクト クラスへのバインディングから取得されています。

ありがとう!...

4

1 に答える 1

1

さて、これを機能させるために使用する適切なプロパティを見つけました。ただし、これらのプロパティ設定について詳しく知るには、いくつか読む必要があります。私のSelectedItemでは、これを行う必要がありました:

SelectedItem="{Binding Path=DataContext.CurrentVerseReference, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"

そして、ボタン コマンドCommandParameterについては、これを行う必要がありました。これがどのように機能したかを理解するには、さらに読む必要があります。

<Button Command="{Binding Path=DataContext.LookupReferencesCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, AncestorLevel=2, Mode=FindAncestor}}" 
                                        CommandParameter="{Binding Path=DataContext.CurrentVerseReference, RelativeSource={RelativeSource AncestorType={x:Type ListBox}, AncestorLevel=2, Mode=FindAncestor}}" 
                                        Template="{StaticResource AddButtonTemplate}"  Cursor="Hand" Width="30"/>

私が理解していないそのAncestorLevelです。ListViewの第 2 レベルにButton コントロールがあるためだと思いますか?

于 2013-09-23T07:23:42.560 に答える