我正在尝试使用ICommand接口实现我的第一个wpf项目。当用户单击重置按钮时,我想取消选择列表框中的所有项目。但我不知道如何在viewmodel中从ICommand访问列表框。我正在使用ICommand的DelegateCommand模式。它显示消息,但无法访问AbsenseCodeListbox。那么这样做的方法是什么?感谢。
<Button Content="Reset" Grid.Column="2" Margin="0,10,20,5" Command="{Binding AbsenceResetCommand}"/>
...
<ListBox Name="AbsenseCodeListbox" ItemsSource="{Binding absenseCodeItems, Mode=OneWay}" Grid.Row="1" Grid.Column="1" Grid.RowSpan="5" Margin="20,0,20,5" >
</ListBox>
我的viewmodel中的代码:
void AbsenceResetCommand_Execute(object arg)
{
MessageBox.Show("_AbsenceResetCommand command");
AbsenseCodeListbox.UnselectAll();//Can't do this way
}
答案 0 :(得分:1)
通常,您的视图模型对象具有类型为ObservableCollection
的公共属性,您可以将其绑定到XAML中ListBox
控件的ItemsSource
属性。
您可以做的是将另一个属性添加到名为SelectedItems
的视图模型中,该模型也是ObservalbeCollection
。您可以使用双向绑定将此属性绑定到ListBox' SelectedItems
属性。然后,要清除ListBox
中的所选项目,您只需清除SelectedItems
集合:
void AbsenceResetCommand_Execute(object arg)
{
SelectedItems.Clear(();
}
答案 1 :(得分:0)
您必须在命令参数中传递listbox,如此
<Button CommandParameter="{Binding ElementName=AbsenseCodeListbox}" Content="Reset" Grid.Column="2" Margin="0,10,20,5" Command="{Binding AbsenceResetCommand}"/>
<ListBox Name="AbsenseCodeListbox" ItemsSource="{Binding absenseCodeItems, Mode=OneWay}" Grid.Row="1" Grid.Column="1" Grid.RowSpan="5" Margin="20,0,20,5" >
</ListBox>
和viewmodel将成为
void AbsenceResetCommand_Execute(object arg)
{
ListBox tempListBox = arg as ListBox;
if (tempListBox != null)
tempListBox.UnselectAll();
}
答案 2 :(得分:0)
您不想访问该控件。您应该将ListBoxItem的IsSelected属性绑定到absenceCodeItem上的IsSelected属性(如果更有意义的话,添加它或创建一个包装类)。然后,您只需在ViewModel中引用absenceCodeItems,并将其IsSelected属性设置为false。
XAML:
<ListBox Name="AbsenseCodeListbox" ItemsSource="{Binding absenseCodeItems, Mode=OneWay}" Grid.Row="1" Grid.Column="1" Grid.RowSpan="5" Margin="20,0,20,5" >
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
命令:
void AbsenceResetCommand_Execute(object arg)
{
MessageBox.Show("_AbsenceResetCommand command");
Foreach (var absenseCodeItem in absenseCodeItems)
absenseCodeItem.IsSelected = false;
}
由于UI虚拟化,您将遇到选择同步的一些问题,因此这里有一些指向3部分系列的链接,显示更完整的实施:Part 1,Part 2,Part 3。