2013-06-11 1 views
0

Im이 WPF에 새로 도입되어 간단한 질문 일 수 있습니다.WPF - ListBox에서 한 행 강조 표시

나는 ListBox가 정의 된 스타일, 글꼴 및 전체 나머지 부분과 함께 있습니다. 거기에 하나의 행을 강조하고 싶지만 문제는 모든 행이 프로그래밍 방식으로 추가되므로 행 속성을 편집하고 전경 collor (예를 들어 충분 함)를 변경할 수 없다는 것입니다. 대상 행 ID를 알고 있지만 해당 ListItemBox 개체에 액세스 할 수있는 방법을 찾을 수 없습니다. 특정 항목에 액세스하려면 :

((MyClass)(Playlist.Items[i])).MyProperty = 0; //Access the i element of ListBox named Playlist 

심지어 가능합니까? 나는 여기와 다른 사이트에서 해결책을 찾았지만 내 경우에는 아무 도움이되지 않는다.

도움 주셔서 감사합니다.

편집 : 행을 선택하는 것이 아니라 전경색을 변경하는 것입니다.

+1

항목에 적합한 데이터 항목 모델을 만들고 ListBoxItems에 적절한 'DataTemplate'을 만듭니다. –

+0

나는 이것에 대해 @HighCore와 함께있다. ListBox의 항목에 대한 특정 View Model 클래스를 정의하고 ListBox의 ItemSource를 이러한 항목의 컬렉션에 바인딩 한 경우 해당 컬렉션을 탐색하여 항목을 찾을 수 있으며 View Model 항목 클래스는 모든 속성을 표시 할 수 있습니다 필요한 바인딩을 지원하려면 필요합니다. –

답변

0

디자인 블렌드를 사용하는 SCRATCH의 목록 상자 컨트롤 템플릿은 목록 상자에서 선택한 항목의 전경색을 변경하는 데 도움이됩니다. 또한 Blend는 WPF UI 디자인을위한 훌륭한 도구이므로 확인하십시오.

+0

선택한 항목의 속성을 변경하고 싶지 않습니다. 어떻게하는지 알고 있습니다. 해당 ID 만 사용하여 항목의 속성을 변경해야합니다. –

2

DataTemplate과 DataTrigger를 사용할 수 있습니다. DataTemplate은 목록 상자의 각 항목 (TextBlock, Image 등)을 원하는대로 정의합니다. DataTrigger는 목록 상자의 각 항목에 특정 데이터 조건을 표시하고 이에 따라 DataTemplate의 스타일을 변경합니다 (예 : 전경색). 이것은 ListBox가 MyProperty라는 속성을 가진 MyClass 컬렉션으로 데이터 바인딩되었다고 가정합니다.

<DataTemplate> 
    <TextBlock Text="{Binding MyProperty}"/> 
<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=ID}"> 
     <DataTrigger.Value> 
      303216 
     </DataTrigger.Value> 
     <DataTrigger.Setters> 
     <Setter Property="Foreground" Value="Navy"/> 
     </DataTrigger.Setters> 
    </DataTrigger> 
</DataTemplate.Triggers> 

</DataTemplate> 

http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.triggers.aspx

+0

@kittyPL - 도움이 되었다면이 답변을 올바르게 표시해주세요. – Darlene

0

이에 대한 적절한 MVVM 솔루션을 구현할 수없는 경우, 당신은 ListBoxItems 특성에서 ListBoxItem의를 얻을 수 있습니다. ListBox이 데이터 바인딩 (ItemsSource 속성 사용) 인 경우 자동으로 생성되는 ListBoxItemDataContext 속성이 ItemsSource 속성에 바인딩 된 컬렉션의 항목으로 설정됩니다. 거기에서 평가할 수 있습니다. 그러나이 방법을 권장하지는 않습니다. 가능한 경우 적절한 MVVM 솔루션을 사용하십시오.

var id = ...; 

var item = (from ListBoxItem i in ListBox1.Items 
      let data = (MyClass) i.DataContext 
      where data.Id == id 
      select i).FirstOrDefault(); 
if (item != null) 
    item.Foreground = Brushes.Red;