2016-03-24 5 views
1

Uygulamamda, değeri temel alarak bir dizini vurgulamanızı istiyorum. örneğin: liste kutusunda "Portakal Suyu" Ben onun değerine dayalı vurgulamak istiyoruz olduğuWpf liste kutusu öğesi değeri nasıl bulunur ve değere göre dizini nasıl vurgulanır?

ArrayList itemsList = new ArrayList(); 
private void button_Click(object sender, RoutedEventArgs e) 
{  
    itemsList.Add("Coffie"); 
    itemsList.Add("Tea"); 
    itemsList.Add("Orange Juice"); 
    itemsList.Add("Milk"); 
    itemsList.Add("Mango Shake"); 
    itemsList.Add("Iced Tea"); 
    itemsList.Add("Soda"); 
    itemsList.Add("Water"); 

    listBox.ItemsSource = itemsList; 
    ApplyDataBinding();  
} 

private void ApplyDataBinding() 
{ 
    listBox.ItemsSource = null; 
    listBox.ItemsSource = itemsList; 
} 

farketmez. Pozisyon değişirse, yine de vurgulanmalıdır. (Seçili dizine göre değil)

+0

listBox.SelectedValue = "Orange Juice"; ? –

+0

@Anton Danylov bir fare tıklatması veya anarrow kullanarak seçilen değer değil. Bir arka plan rengi hava vermek istiyorum "Portakal Suyu" seçildi ya da değil ... Bu yüzden başka bir şey seçilmiş olsa bile sürekli "Portakal Suyu" vurgulamak istiyorum! ve pozisyon değiştiğinde hala vurgulanır – Decoder94

+0

İstenilen sonuca ulaşmak için minimum kod değişikliklerine bir cevap eklendi. –

cevap

0

Değeri temel alarak bir öğeyi vurgulamak isterseniz, bir öğe için kendi veri sayfanızı tanımlamanız ve arka plan için uygun fırça sağlamak üzere dönüştürücüyü kullanmanız gerekir. Bunun gibi bir şey:

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> 

Dönüştürücü Sana bir sınıfa öğeleri yerleştirmek öneriyoruz

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

Gerçekten iyi çalışıyor teşekkürler! @Anton Danylov – Decoder94

+0

Olaylar Sadece form yükü üzerinde tetikler olayın sürekli/çalışma süresi sırasında tetiklenmesinin bir yolu vardır. Dinamik "Soda" "portakal suyu" değiştirirseniz? – Decoder94

+0

Liste öğelerinizin Ad ve Arka Plan özellikleriyle birlikte INotifyPropertyChanged arabirimini uygulayan sınıfın nesne olacağı MVVM desenine yapışmanızı öneririm. Diğer durumda hala TextToBrushConverter.Convert yöntemini tetiklemek için ApplyDataBinding() yöntemini çağırabilirsiniz. Dönüştürme yönteminde arka plan rengini seçen mantığı uygulayabilirsiniz. –

0

, (aynı Nesne daha sonra tasarım Odaklı ve özelliklerinin kapalı çalışma düşünüyorum bayraklar) farklı devletler vermek.

Ardından, Xaml stillerini kullanarak, aradığınız etkiyi elde etmek için bu farklı özellikleri devre dışı bırakın. Bir sipariş ilerleme (= trueInProgress) gibi işaretlendiğinde bizler liste kutusu "için söylemek kırmızı göstermek istiyorum bu özelliklerin

public class Order 
{ 
    public string CustomerName { get; set; } 
    public int OrderId { get; set; } 
    public bool InProgress { get; set; } 
} 

ile Order sınıf var örneğin


Say Alfa" ve "Omega" hangi devam etmektedir:

enter image description here

ListBox Xaml

Burada

(Bağlayıcı nasıl size kalmış) verilerimiz bağlanır ve bunu sağlamak için Style (ler), DataTemplate ve DataTrigger (ler) ile çalışmak nasıl gösterir Xaml geçerli:

İşte
<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> 

bunu sayfaların en kaynağın Xaml veri kurulumu, ama arkasındaki kodu oluşabileceğini:

<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> 

Bu özellik, tam özellikli bir kullanıcı arayüzünü oluşturmaya ve oluşturmaya yetecek kadar veri sağlamalıdır.