我的项目中有很多列表框。我将所选项目从一个列表框移动到另一个列表框。 在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属性,但我想只有一个)
答案 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}"../>