3

私はリストボックスを持っており、各リストボックス項目は私が作成したカスタムユーザーコントロールです。スタイルを使用して、リストボックスアイテムのデフォルトのハイライトをすべて削除しました(つまり、選択したアイテムの青い背景のハイライトを削除しました)。

私が望んでいるのは、リストボックス項目が強調表示されていることを示すために、ユーザーコントロールに特別なことを実行できるようにすることです。たとえば、ユーザーコントロールの境界線をより太くするなどです。

ブール値をユーザーコントロールに取り込むことができれば、そこから、コンバーターなどを使用して、ユーザーコントロールに必要な変更を加える方法を理解できると思います。

よくわからないのは、ユーザーコントロールが含まれているリストボックスアイテムが強調表示されているかどうかを示す情報をユーザーコントロールに渡す方法です。

問題のコードは次のようになります。

<ListBox.ItemTemplate>
 <DataTemplate>
  <hei:OrangeUserCtrl DataContext="{Binding}" Height="40" Width="40" />
 </DataTemplate>
</ListBox.ItemTemplate>

リストボックス項目が強調表示されている場合、どうすればユーザーコントロールに(できればtrue / falseとして)渡すことができますか?

ありがとう

4

2 に答える 2

1

Tagプロパティと RelativeSource バインディングを使用できます。

私の例では、項目が強調表示されているときに、Border プロパティ (BorderBrush=RedおよびBorderThickness=3) を変更しました。

ソースコード:

データを保持する単純なクラス:

class Person
{
   public string Name { get; set; }
   public string Surname { get; set; }
}

リストボックス:

 <ListBox ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <local:MyCustomPresenter DataContext="{Binding}" 
                                             Tag="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, UpdateSourceTrigger=PropertyChanged}"
                                             Height="60" Width="120" />               
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>   

カスタム データを表示する UserControl:

<UserControl x:Class="WpfTextWrapping.MyCustomPresenter"
             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" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Border Margin="10">
        <Border.Style>
            <Style TargetType="Border">
                <Setter Property="BorderBrush" Value="Green" />
                <Setter Property="BorderThickness" Value="1" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, UpdateSourceTrigger=PropertyChanged}" Value="True">
                        <Setter Property="BorderBrush" Value="Red" />
                        <Setter Property="BorderThickness" Value="3" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>

        <StackPanel Orientation="Vertical">
            <TextBlock Text="{Binding Name}" />
            <TextBlock Text="{Binding Surname}" />
        </StackPanel>        
    </Border>
</UserControl>
于 2013-01-17T16:40:06.860 に答える
0

私があなたをよく理解していれば、次のようなUserControl入れ子になったものにバインドされたカスタムにプロパティを追加する必要があります。ComboBox

  public object MySelectedItem
    {
        get { return myNestedCombox.SelectedItem; }
        set { myNestedCombox.SelectedItem = value; }
    }

あなたもそうする必要がありNotifyPropertyChangedます。

于 2013-01-17T16:21:28.950 に答える