如何从ViewModel中的ICommand Execute()访问控件?

时间:2014-04-18 18:25:38

标签: wpf xaml

我正在尝试使用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

}

3 个答案:

答案 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 1Part 2Part 3