2016-03-24 14 views
1

私のアプリケーションでは、値に基づいてインデックスを強調表示したいと思います。wpfリストボックスの項目値を検索し、その値に基づいてインデックスを強調表示するにはどうすればよいですか?

リストボックス "オレンジジュース"のどこに値を指定して強調表示したいのですか。位置の変更がまだ強調表示されている必要があります。

+0

listBox.SelectedValue = "Orange Juice"; ? –

+0

@Anton Danylovマウスクリックまたはアンローを使用して選択した値ではありません。私は背景色の天気 "オレンジジュース"を選択するかどうかを指定したいと思います...他に何かが選択されても、常に "オレンジジュース"を強調したいと思います!位置が変更されたときにはまだ強調表示されています – Decoder94

+0

希望の結果を得るために最小限のコード変更で回答を追加しました。 –

答えて

0

アイテムを値に基づいて強調表示したい場合は、アイテムに独自のデータテンプレートを定義し、コンバーターを使用してバックグラウンドに適切なブラシを提供する必要があります。そのような何か:

results

<Window.Resources> 
    <local:TextToBrushConverter x:Key="TextToBrushConverter" /> 
</Window.Resources> 
<Grid> 
    <ListBox Name="listBox" HorizontalContentAlignment="Stretch"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}" Background="{Binding ., Converter={StaticResource TextToBrushConverter}}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

コンバータ

class TextToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if ((value as String) == "Orange Juice") 
     { 
      return Brushes.Orange; 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

本当にありがとうございます! @Anton Danylov – Decoder94

+0

イベントは、フォームロード時にトリガするだけで、実行時にイベントをトリガする方法があります。ダイナミックなので、「オレンジジュース」をソーダに変更しますか? – Decoder94

+0

私はMVVMパターンに固執することをお勧めします。ここでは、リスト項目は、NameプロパティとBackgroundプロパティを持つINotifyPropertyChangedインタフェースを実装するクラスのオブジェクトになります。それ以外の場合でも、TextToBrushConverter.Convertメソッドをトリガーするために、ApplyDataBinding()メソッドを呼び出すことができます。 Convertメソッドでは、背景色を選択するロジックを実装できます。 –

0

私は、あなたがクラスにアイテムを配置することをお勧めしますは、オブジェクト指向設計と思うし、[プロパティ]をオフに動作(などフラグ)を使用してさまざまな状態を指定します。

次に、Xamlスタイルを使用して、さまざまなプロパティをキーオフして、目的の効果を達成します。


例えば、我々は我々がリストボックスに赤を表示するこれらのプロパティ

注文が進行中としてマークされ
public class Order 
{ 
    public string CustomerName { get; set; } 
    public int OrderId { get; set; } 
    public bool InProgress { get; set; } 
} 

(= trueInProgress)とOrderクラスは "のために言って持っていると言いますアルファ」と "進行中であるオメガ":

enter image description here

ListBoxのXAML

ここ

(あなたがバインドする方法あなた次第です)私たちのデータに結合し、それを達成するためにStyle(s)は、DataTemplate、およびDataTrigger(S)と連携する方法を示してXAMLです:

ここで
<ListBox ItemsSource="{StaticResource Orders}" 
     x:Name="lbOrders"> 
    <ListBox.Resources> 
     <DataTemplate DataType="{x:Type model:Order}"> 
      <TextBlock Text="{Binding Path=CustomerName}" /> 
     </DataTemplate> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=InProgress}" 
          Value="True"> 
        <Setter Property="Foreground" 
          Value="Red" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.Resources> 
</ListBox> 

はそれを行うには、ページのリソースXAMLでのデータ設定であるが、それは背後にあるコードで作成することができます

<Window.Resources> 
    <model:Orders x:Key="Orders"> 
     <model:Order CustomerName="Alpha" 
         OrderId="997" 
         InProgress="True" /> 
     <model:Order CustomerName="Beta" 
         OrderId="998" 
         InProgress="False" /> 
     <model:Order CustomerName="Omega" 
         OrderId="999" 
         InProgress="True" /> 
     <model:Order CustomerName="Zeta" 
         OrderId="1000" 
         InProgress="False" /> 
    </model:Orders> 
</Window.Resources> 

これで十分な機能を備えたUIを作成して作成することができます。

関連する問題