按选定项目(listboxitem)获取控件名称(列表框) - MVVM

时间:2013-11-26 13:42:36

标签: c# wpf mvvm listbox

我的项目中有很多列表框。我将所选项目从一个列表框移动到另一个列表框。 在XAML文件中,我将SelectedItem绑定到我的属性。

<GroupBox Header="A"  Grid.Column="0">
  <ListBox Width="200" Name="lbWMSmaterials" ItemsSource="{Binding WMSmaterialItems}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" DisplayMemberPath="Name" />
</GroupBox>
<GroupBox Header="B"  Grid.Column="1">
  <ListBox Width="200" Name="lbCommonMaterials" ItemsSource="{Binding commonMaterialItems}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" DisplayMemberPath="Name"/>
</GroupBox>
<Button Command="{Binding MoveListBoxItem}" CommandParameter="common_material_down" Grid.Column="5" Style="{StaticResource buttonStyleDown}" Name="d_c_m" />
<Button Command="{Binding MoveListBoxItem}" CommandParameter="common_material_up" Grid.Column="6" Style="{StaticResource buttonStyleUpAll}" Name="u_c_m" />

我在我的按钮中绑定命令以执行某些逻辑,我也通过命令参数知道我点击的按钮。每个按钮将所选项目移动到另一个列表框。

public DemoItem SelectedItem { get; set; }

public DelegateCommand<string> MoveListBoxItem
        {
            get
            {
                return new DelegateCommand<string>(
                  new Action<string>(
                    (e) =>
                    {
                        switch (e)
                        {
                            case "common_material_down":
                                if (SelectedItemDown != null)
                                {
                                    WMSarticleItems.Add(SelectedItemDown);
                                    this.Remove(SelectedItemDown);
                                }
                                break;

                             //... other cases
                            default:
                                break;
                        }
                    }),
                  (e) => { return true; });
            }

我需要知道当前与我的SelectedItem属性相关的列表框的名称

如何在不破坏MVVM模式的情况下做到这一点? (解决方法是为每个lisbox创建许多SelectedItem属性,但我想只有一个)

1 个答案:

答案 0 :(得分:0)

使用MVVM。在MVVM中,我们不移动 UI对象,而是操纵数据对象。因此,如果 使用MVVM,那么您不需要知道任何UI元素的名称。

而不是那样,您只需将视图模型中的SelectedItem属性绑定到SelectedItem *的ListBox属性,然后添加此数据对象(或其副本) )到集合中的是绑定到要将项目移动到的相关ListBox的数据。在这种情况下,您的ICommand代码将是这样的:

Collection1.Remove(Collection1.Where(c => c.Equals(SelectedItem)).Single());
Collection2.Add(SelectedItem);

你的XAML会是这样的:

<ListBox ItemsSource="{Binding Collection1}" SelectedItem="{Binding SelectedItem}".../>
...
<ListBox ItemsSource="{Binding Collection2}" SelectedItem="{Binding SelectedItem2}"../>