WPF Listbox를 "읽기 전용"할 수 있습니까?
-
03-07-2019 - |
문제
항목 목록을 표시하려는 시나리오가 있으며 "현재"항목 (작은 화살표 마커 또는 변경된 배경색)을 나타냅니다.
"selectedItem"의 컨텍스트가 필요하기 때문에 ItemsControl은 우리에게 좋지 않습니다. 그러나 선택을 프로그래밍 방식으로 옮기고 사용자가 변경할 수 없습니다.
ListBox를 비inCinteractive로 만드는 간단한 방법이 있습니까? 우리는 의도적으로 마우스와 키보드 이벤트를 삼켜서 퍼지 할 수 있지만, 우리가 원하는 것을 제공하는 기본 속성 (시각적 스타일에 영향을 미치지 않고 "Isenabled"에 거짓으로 설정)을 놓치고 있습니까?
아니면 ... 두 세계에서 가장 좋은 또 다른 WPF 컨트롤이 있습니까?
해결책
한 가지 옵션은 설정하는 것입니다 ListBoxItem.IsEnabled
에게 false
:
<ListBox x:Name="_listBox">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
이렇게하면 항목을 선택할 수 없지만 원하는대로 렌더링하지 못할 수도 있습니다. 이 문제를 해결하기 위해 트리거 및/또는 템플릿으로 놀 수 있습니다. 예를 들어:
<ListBox x:Name="_listBox">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
다른 팁
나는 같은 문제가 있었다. iSenabled 세트를 True로두고 Listbox의 미리보기 이벤트를 처리하여 해결했습니다. 핸들러 세트에서 E.가 true로 편집되지 않기를 원하지 않는 경우.
private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = !editRights;
}
ItemsControl/Listbox가 데이터 라운드입니까?
나는 당신이 소스 데이터의 속성에 묶인 각 항목의 배경 브러시를 만들거나 컨버터를 통해 속성을 전달할 수 있다고 생각합니다. 같은 것 :
<ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Margin="0">
<ItemsControl.Resources>
<local:SelectedConverter x:Key="conv"/>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:Control Background="{Binding Path=IsSelected, Converter={StaticResource conv}}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
첨부 된 속성을 사용하여 선택할 수없는 ListBoxItem (또는 ListViewItem) 기능 :http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/