2017-09-05 63 views
-1

私は、WPF、C#とそのすべての良いもの(Visual Studio 2010も)を使用するプロジェクトを持っています。WPF ControlTemplateトリガー

私はWPF ListBoxを持っており、そのListBox内にListBoxItemのコントロールテンプレートがあります。その中にはトリガーのセクションがあります。

この特定のケースでは、トリガプロパティはIsSelectedで、ListBoxの選択項目を参照します。

私がしたいことは、これをListBoxコントロールから取り出し、それをリソースリストのControlTemplateに入れることです。

これを行うと、フレームワーク要素内に「IsSelected」が存在しないことが正しく伝えられます。

誰かがこれを完了する方法についていくつかの示唆を与えることができますか?

ありがとうございました。

ああ、XAMLコードはここにある:

<ControlTemplate.Triggers> 
       <Trigger Property="IsSelected" Value="true"> 
        <Setter TargetName="_Border" Property="Effect"> 
         <Setter.Value> 
          <DropShadowEffect ShadowDepth="0" Color="Black" Opacity="1" BlurRadius="20" /> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </ControlTemplate.Triggers> 

は編集:

<Trigger Property="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" Value="true"> 

は、しかし、私はエラーが「『』バインディングが上に設定することができないと言ってます:私はこれを試してみました'トリガ'タイプの 'プロパティ'プロパティ。

エクストラ編集:あなたはここにコントロールテンプレートのトリガーを見ればそう、それは(「_Border」と呼ばれる)の境界線に適用されます

<ListBox ItemsSource="{Binding ChatNodeListViewModel.ChatNodeVMs, Source={StaticResource Locator}}" Background="Transparent" Name="LbNodes" SelectedItem="{Binding ChatNodeListViewModel.SelectedNode, Source={StaticResource Locator}}" > 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas HorizontalAlignment="Left" VerticalAlignment="Top" Width="2000" Height="1600"/> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="ListBoxItem"> 

           <Border x:Name="_Border" Padding="1" SnapsToDevicePixels="true" BorderThickness="3" Margin="2" CornerRadius="5,5,5,5" BorderBrush="{Binding IsHeadNode, Converter={StaticResource ResourceKey=HeadNodeToLinearGradientBrushConverter}}" > 

            <ContentPresenter /> 
           </Border> 

           <ControlTemplate.Triggers> 
            <Trigger Property="IsSelected" Value="true"> 
             <Setter TargetName="_Border" Property="Effect"> 
              <Setter.Value> 
               <DropShadowEffect ShadowDepth="0" Color="Black" Opacity="1" BlurRadius="20" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 
           </ControlTemplate.Triggers--> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 

        <Setter Property="Canvas.Left" Value="{Binding XCoord}"/> 
        <Setter Property="Canvas.Top" Value="{Binding YCoord}"/> 
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lb_PreviewMouseLeftButtonDown" /> 

       </Style> 
      </ListBox.ItemContainerStyle> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}"> 

          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="DragDelta"> 
            <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/> 
           </i:EventTrigger> 

          </i:Interaction.Triggers> 
         </Thumb> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

さてさて、ここでのListBoxのためのXAMLです。今問題は、これは、(NodeVisualTemplateと呼ばれる)ListBoxItemのコントロールテンプレートとは別に、ボーダーを私に残すことです。 NodeVisualTemplateにその境界線を配置したいのですが、IsSelectedプロパティへのリンクをどのように保持するかについてはわかりません。それはちょっと問題の根源です。

+1

これはListBoxではなくListBoxItemテンプレートの一部であるようです。 – Clemens

+0

XAML、おそらくControlTemplate全体を共有する必要があります。おそらくListBoxのXAML全体です。 –

+0

申し訳ありません、私はいくつかの情報でそれを更新しました。 – TheFaithfulLearner

答えて

1

Triggerはちょうどスタイリング(それはスタイルトリガーの場合)が、DataTriggerみましょうあなたがBindingから取得することができます任意の値をトリガあなたがテンプレート化やしているコントロールのプロパティに名前を付けることができます。

これはずっと強力です。 WPFのBindingクラスは、さまざまなことを行うことができます。私はThumbテンプレートのRelativeSourceで、視覚ツリーを検索して、最も近い親コントロールのタイプがListBoxItemであることを確認してから、ListBoxItemのIsSelectedプロパティ値を取得します。結果として得られるThumbテンプレートは、ListBoxItemsに属するThumbsでのみ有効ですが、これは問題ありません。

<DataTrigger 
    Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" 
    Value="true" 
    > 
    ... 
関連する問題