Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MVVM列表框Silverlight中实现SelectionChanged_Silverlight_Mvvm_Listbox_Command_Selectionchanged - Fatal编程技术网

如何在MVVM列表框Silverlight中实现SelectionChanged

如何在MVVM列表框Silverlight中实现SelectionChanged,silverlight,mvvm,listbox,command,selectionchanged,Silverlight,Mvvm,Listbox,Command,Selectionchanged,ListBox控件未实现命令属性。我必须为SelectionChanged事件附加一些功能。有人知道我怎么做?请帮助我我想这篇来自Laurent Bugnon的文章将帮助你解决这个问题: 上面的帖子提到了DataGrid,但我确实认为它也可以与ListBox一起使用 致以最良好的祝愿,新年快乐!!:) 我建议使用RelayCommand。使用或仅使用中的RelayCommand和CommandManager类。我个人只使用这两个类,所以我不需要整个工具包 虽然这肯定会起作用,但根据您所做的,可

ListBox控件未实现命令属性。我必须为SelectionChanged事件附加一些功能。有人知道我怎么做?请帮助我

我想这篇来自Laurent Bugnon的文章将帮助你解决这个问题:

上面的帖子提到了DataGrid,但我确实认为它也可以与ListBox一起使用


致以最良好的祝愿,新年快乐!!:)

我建议使用
RelayCommand
。使用或仅使用中的
RelayCommand
CommandManager
类。我个人只使用这两个类,所以我不需要整个工具包


虽然这肯定会起作用,但根据您所做的,可能有一种更简单的方法。将对象绑定到
列表框
SelectedValue
并侦听该值的更改可能更容易。

我更喜欢使用对
SelectedItem
的绑定,并在绑定属性的设置中实现任何功能

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />

公共类视图模型
{
公共IEnumerable项{get;set;}
私有项目selectedItem;
公共项目选择项
{
获取{return selectedItem;}
设置
{
如果(selectedItem==值)
返回;
选择editem=值;
//对选择进行逻辑更改。
}
}
}

基本上,您有几个选择:

  • 使用ListBox的属性SelectedItem绑定到后端(即视图模型)中的属性,并在setter中执行逻辑,如Cameron MacFarland所述
  • 使用具有通用事件的第三方库来命令行为,如Pedro Lamas发布的链接中的行为
  • 如果您不想使用第三方库,或者在属性setter中编写逻辑是不可接受的,您可以为ListBox控件创建自己的行为。它将订阅控件的
    SelectionChanged
    事件并执行一个命令(该命令可能是行为公开的依赖属性)

  • 这是在MVVM应用程序中访问选择更改事件的方法 首先,我告诉你们命令属性只在按钮中工作,现在我们必须显式地 在我们的选择中绑定该属性会更改事件,如列表框或组合框 在您的XMAL文件中

    <ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118">
    
            <Local:Interaction.Triggers>
                <Local:EventTrigger EventName="SelectionChanged">
                    <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/>
                </Local:EventTrigger>
            </Local:Interaction.Triggers>
        </ListBox>
    
    在ViewModel类中,必须在Con结构中定义命令

     public ViewModel123()
        {
             MyCommand = new RelayCommand<string>(TestMethod);
    
        }
    

    我希望这能帮助你。

    @Simsons,只要你有办法绑定到多重选择。我相信在多选过程中会忽略SelectedItem属性。我更喜欢这种方法而不是交互。触发器方法,因为它不需要对System.Windows.Interactions和“”的引用,而我在Visual Studio 2010中经常遇到这些问题。不过,在SelectedItem绑定中还有一个附加项,需要Mode=TwoWay。@JeffBerry SelectedItem默认为TwoWay。从概念的角度来看,从getter进行逻辑选择更改是否好?从几天开始问我自己…我更喜欢这种方式,因为我认为它更干净。
     xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity"
    
     public ViewModel123()
        {
             MyCommand = new RelayCommand<string>(TestMethod);
    
        }
    
     private void TestMethod(string parameter)
        {
            MessageBox.Show(parameter);
        }