我建立一个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