WPF ListBox에 항목 목록이 있습니다. 사용자가 이러한 항목을 여러 개 선택하고 제거 단추를 클릭하여 목록에서 이러한 항목을 제거 할 수있게하려고합니다. 이 같은MVVM RelayCommand를 통해 ListBox에서 SelectedItems 제거
내보기에서public RelayCommand<IList> RemoveTagsCommand { get; private set; }
, 내가 묶을 내 RemoveTagsCommand :
<DockPanel>
<Button DockPanel.Dock="Right" Command="{Binding RemoveTagsCommand}" CommandParameter="{Binding ElementName=TagList, Path=SelectedItems}">Remove tags</Button>
<ListBox x:Name="TagList" ItemsSource="{Binding Tags}" SelectionMode="Extended">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Resources>
<DataTemplate DataType="{x:Type Model:Tag}">
...
</DataTemplate>
</ListBox.Resources>
</ListBox>
</DockPanel>
내 뷰 모델의 생성자 MVVM RelayCommand 패턴을 사용하여
는, 나는 다음과 같은 서명 명령을 만들었습니다 다음 명령의 인스턴스를 설정합니다.
RemoveTagsCommand = new RelayCommand<IList>(RemoveTags, CanRemoveTags);
현재 구현 중입니다. RemoveTags의 기능은 캐스트 및 복사 기능과 함께 거추장 스럽습니다. 이것을 구현하는 더 좋은 방법이 있습니까? 그게 당신이 어쨌든 얻기 위하여려고하고있는 무슨이기 때문에
public void RemoveTags(IList toRemove)
{
var collection = toRemove.Cast<Tag>();
List<Tag> copy = new List<Tag>(collection);
foreach (Tag tag in copy)
{
Tags.Remove(tag);
}
}
불행히도 강력한 형식의 IList를 사용할 수 없습니다. 이것이 WPF에 의해 반환 된 SelectedItemCollection의 한계라고 생각하지만, RelayCommand의 특정 풍미 때문일 수도 있습니다. – dthrasher
이 부분을 다시 한 번 살펴보면, 제거의 결과로 SelectedItems 목록이 변경 될 수 있다는 사실이 우려됩니다. 그렇다면이 코드는 당신이 얻는만큼 깨끗하다고 생각합니다. RelayCommand가 Cast를 내부적으로 지원하도록하고 싶지 않다면 캐스트는 피할 수 없습니다 ('IList'를'IList'에 적용하는 암시적인'Cast '을 가진'RelayListCommand '과 같은 것). –
고마워, 댄. 당신 말이 맞아요. 복사와 주조가 약간 어색해 보이지만 일이 끝납니다. – dthrasher