0

ユーザーコントロールで TreeView をカスタマイズしました。HierarchicalDataTemplate には、方向のある画像があります (例では矢印)。

application\UserControl フローの方向が変わると、画像を反転する必要があります。

それで、Image.FlowDirection(RightToLeftのときに自動的に画像を反転する)をUserControl.FlowDirectionにバインドしようとしました

<Image FlowDirection="{Binding Path=FlowDirection, 
                               ElementName=MyUserControl}" ... />

しかし、それは機能していません。テンプレート内から UserControl が見つからないためだと思います。テンプレートの外でこのバインディングを試してみましたが、うまくいきました。

解決策はありますか?テンプレート内から UserControl を取得するにはどうすればよいですか?

- アップデート -

この xaml には 2 つのバインディング場所があります。1 つ目はボタンのスタイルで動作しており、2 つ目は TreeViewItem のテンプレートで動作していません。

<UserControl x:Class="MyTree"
...
    d:DesignHeight="218" d:DesignWidth="284" x:Name="MyLayerListControl">
<UserControl.Resources>
        <Style x:Key="CloseButtonStyle" TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                ...
                            </VisualStateManager.VisualStateGroups>

                            <Border x:Name="CloseButtonBorder" BorderThickness="0" Margin="3" CornerRadius="0" Background="Gray" >

<!-- THIS BINDING IS WORKING -->
                                <Image Source="{StaticResource back}" Margin="2"
 FlowDirection="{Binding Path=FlowDirection, ElementName=MyLayerListControl}"/>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="Transparent">

<Button Style="{StaticResource CloseButtonStyle}" />    

<Grid>
     <Grid.ColumnDefinitions></Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
          <RowDefinition Height="Auto"></RowDefinition>
          <RowDefinition Height="*"></RowDefinition>
     </Grid.RowDefinitions>


     <Grid.Resources>
         <sdk:HierarchicalDataTemplate x:Key="LayerListTemplate" ItemsSource="{Binding Path=Childrens}" >
             <Grid>
               <Border CornerRadius="2" BorderBrush="#FF6DBDD1" BorderThickness="1" Background="#FFBADDE9" Opacity="0.5"  /> 
               <StackPanel Orientation="Vertical">
                  <!-- The Item -->
                  <StackPanel Orientation="Horizontal" Margin="3">

<!-- THIS BINDING IS NOT WORKING -->
                     <Image x:Name="ArrowImage" Width="16" Height="16" Source="{StaticResource arrow}" 
FlowDirection="{Binding Path=FlowDirection, ElementName=MyLayerListControl}"/>

                  </StackPanel>

               </StackPanel>
            </Grid>
        </sdk:HierarchicalDataTemplate>
    </Grid.Resources>

    <sdk:TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource LayerListTemplate}" x:Name="MyTreeView" Grid.Row="1" />
</Grid>

</Grid>
</UserControl>
4

1 に答える 1

0

@Chris が言うように、Control 自体にバインドしているため、バインド パスの前に「DataContext」を追加します。そのため、FlowDirection が DataContext のプロパティである場合は、それが必要です。

また、バインディングに Mode=TwoWay があることを確認してください。

別の方法として、RelativeSource を使用すると、ElementName をハードコーディングする必要がなくなります。

チェックアウト: http://tonychampion.net/blog/index.php/2011/12/7th-day-of-silverlight-ancestor-relative-source-binding/

于 2013-10-01T21:15:21.077 に答える