我建立一個WPF應用程序(.NET 4.0),我有以下情況:WPF/MVVM結合複選框selectedItem屬性
<ListBox
ItemsSource="{Binding Path=Items}"
SelectedItem="{Binding Path=SelectedItem}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Height" Value="48"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel>
<!-- ... -->
<CheckBox>
<CheckBox.IsChecked>
<!-- Something here that behaves like SelectedItem binding -->
</CheckBox.IsChecked>
</CheckBox>
</DockPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
- ListBox的的ItemSource勢必一個ObservableCollection <>。
- ListBox的SelectedItem綁定到ViewModel的SelectedItem屬性 。
但是,當ViewModel.SelectedItem更新時,一小段長時間運行(2-3s)的異步任務將被啓動。 通過簡單地選擇列表框中的不同項目來排隊大量的異步任務是非常容易的,所以我正在研究將ViewModel.SelectedItem綁定到CheckBox(包含在ItemTemplate中)。
我對WPF相當陌生,但在窗體中我會附加一個事件處理程序並編寫一些冗長而難看的代碼來取消所有項目,但觸發事件的項目,然後以編程方式更新屬性。我希望有一些更好的解決方案,我已經看過使用ValueConverter,但我不知道如何綁定到父視圖模型(具有ObservableCollection <>)。
如果有人遇到過類似的要求,我真的很感激一些指針。
乾杯!
./Fredrik
不會吧通過反覆點擊複選框,排隊大量異步任務同樣容易嗎?我猜你需要的是一種機制,在新的啓動時取消當前正在運行的任務。而且您可能會考慮延遲執行任務,而不是在所選項目更改時立即執行。 – Clemens
嗨克萊門斯,thans響應!是的,它會,但是在異步任務運行時防止更改已選狀態應該不會太困難。我試圖在任務運行時禁用ListBox,但這太難看了。添加CheckBox的好處是ListBox中的選擇與任務分離,允許用戶在任務運行時瀏覽列表框。 – Fredrik
您也可以考慮在列表框外部(而不是所有複選框)有一個專用按鈕來啓動當前選定項目上的任務。這不僅更容易實現,而且還可能導致更直觀的用戶界面。 – Clemens