2016-10-24 3 views
0

私はCodeProject [http://www.codeproject.com/Articles/563862/Multi-Select-ComboBox-in-WPF]]にあるマルチ選択コンボボックスを使用しています。データトリガーを使用してWPF Comboboxの矢印を変更します。

すべてのアイテムが選択されているかどうかによって、矢印の形状を変更しようとしています。しかし、私はsetterのx:Nameという名前を正しく参照することができませんでした。ここで

は私が修正しようとしてきたコードです:

<UserControl x:Class="Z_Sys_UI.System.MultiSelectComboBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" > 
<ComboBox 
    x:Name="MultiSelectCombo" 
    SnapsToDevicePixels="True" 
    OverridesDefaultStyle="True" 
    ScrollViewer.HorizontalScrollBarVisibility="Auto" 
    ScrollViewer.VerticalScrollBarVisibility="Auto" 
    ScrollViewer.CanContentScroll="True" 
    IsSynchronizedWithCurrentItem="True" 
         > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Title}" 
         IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" 
         Tag="{RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}" 
         Click="CheckBox_Click"   /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBox.Template> 
     <ControlTemplate TargetType="ComboBox"> 
      <Grid > 
       <ToggleButton 
        x:Name="ToggleButton" 
        Grid.Column="2" IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
        Focusable="false"       
        ClickMode="Press" HorizontalContentAlignment="Left" > 
        <ToggleButton.Template> 
         <ControlTemplate> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="18"/> 
           </Grid.ColumnDefinitions> 
           <Border 
       x:Name="Border" 
       Grid.ColumnSpan="2" 
       CornerRadius="2" 
       Background="White" 
       BorderBrush="Black" 
       BorderThickness="1,1,1,1" /> 
           <Border 
       x:Name="BorderComp" 
       Grid.Column="0" 
       CornerRadius="2" 
       Margin="1" 
      Background="White" 
       BorderBrush="Black" 
       BorderThickness="0,0,0,0" > 
            <TextBlock Text="{Binding Path=Text,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
              Background="White" Padding="3" /> 
           </Border> 
       <Path 
       x:Name="Arrow" 
       Grid.Column="1"  
       Fill="Black" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Data="M 0 0 L 4 4 L 8 0 Z"> 
           </Path> 
          </Grid> 
         </ControlTemplate> 
        </ToggleButton.Template> 
       </ToggleButton> 
       <Popup 
        Name="Popup" 
        Placement="Bottom"       
        AllowsTransparency="True" 
        Focusable="False" IsOpen="{TemplateBinding IsDropDownOpen}" 
        PopupAnimation="Slide"> 
        <Grid 
           Name="DropDown" 
           SnapsToDevicePixels="True" 
         MinWidth="{TemplateBinding ActualWidth}" 
           MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
         <Border 
           x:Name="DropDownBorder" 
           BorderThickness="1" Background="White" 
           BorderBrush="Black"/> 
         <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" DataContext="{Binding}"> 
          <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
         </ScrollViewer> 
        </Grid> 
       </Popup> 
      </Grid> 
      <ControlTemplate.Triggers> 
       <Trigger Property="HasItems" Value="false"> 
        <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/> 
       </Trigger> 
       <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true"> 
        <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/> 
        <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/> 
       </Trigger> 
       <DataTrigger Binding="{Binding Path=SelectAll, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" Value="false" > 
        <Setter TargetName="Arrow" Property="Data" Value="M 0 0 L 2 2 L 8 0 Z" /> 
       </DataTrigger> 
      </ControlTemplate.Triggers> 

     </ControlTemplate> 
    </ComboBox.Template> 
</ComboBox> 

今のところは、名前アローが認識されないと言うエラーを与えている、と会員データが認識されませんか、アクセスできません。

私がオフにしようとしているSelectAllパスも機能しない可能性があります。 CodeProjectコードは、そのプロパティが完全に実装されていないようです。私はその可能性を後で取り上げます。

ご回答いただきありがとうございます。それはToggleButtonControlTemplateで定義されているため

+0

トグルボタンテンプレート内に存在するコントロールを変更するトリガは、トグルボタンテンプレート自体でなければなりません。しかし、それはどのようにComboBoxのプロパティにバインドされますか? ToggleButtonのControlTemplate内のDataTriggerで動作するようにAncestorTypeバインディングを取得できない場合は、取得したトリガを取り、ToggleButtonのテンプレート全体を変更しようとします。 ToggleButton ControlTemplateの2つのコピーを作成します。それぞれのバージョンは矢印付きです。 –

答えて

2

Arrowは、ComboBoxControlTemplateに範囲外です。解決策は簡単であることが判明しました。ターゲットコントロールが有効範囲内にあるテンプレートにトリガを置くだけです。

<ToggleButton.Template> 
    <ControlTemplate> 
     <Grid> 

      <!-- snip snip snip --> 
      <!-- snip snip snip --> 
      <!-- snip snip snip --> 

      <Path 
       x:Name="Arrow" 
       Grid.Column="1"  
       Fill="Black" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Data="M 0 0 L 4 4 L 8 0 Z" 
       > 
      </Path> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <DataTrigger 
       Binding="{Binding Path=SelectAll, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" 
       Value="false" > 
       <Setter 
        TargetName="Arrow" 
        Property="Data" 
        Value="M 0 0 L 2 2 L 8 0 Z" 
        /> 
      </DataTrigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</ToggleButton.Template> 

私はそれはあなたがそれをやっていることによって暗示しているように見えるのでSelectAllは、boolean型依存関係プロパティ、およびMultiSelectComboBoxのメンバーであることを仮定しています。ここに私の依存関係プロパティの定義があります:

public static readonly DependencyProperty SelectAllProperty = 
     DependencyProperty.Register("SelectAll", typeof(bool), typeof(MultiSelectComboBox), 
      new PropertyMetadata(false)); 

そして、ここでは、私が使用したテストXAMLです:

<StackPanel 
    Orientation="Vertical" 
    > 
    <CheckBox Content="SelectAll" x:Name="SelectAllCheckBox" /> 
    <local:MultiSelectComboBox 
     SelectAll="{Binding IsChecked, ElementName=SelectAllCheckBox}" /> 
</StackPanel> 
+0

これまでのところとても良い、ありがとう。ターゲットコントロールがスコープ内にあるテンプレートにトリガを置くと、私が得たxamlエラーが修正されました。 'SelectAll'はブール値の依存関係プロパティで、次のステップでそれが動作するかどうかを確認します。 – dev1998

+0

それはすべて良いです。私はあなたのxamlの変更を実装し、私はそれを試して初めて働いた。私は既にSelectAllが適切に設定されることを確認するために、既存のコードを変更しました。 – dev1998

+0

@ dev1998良いニュース! –

関連する問題