【问题标题】:How can I realize SelectionChanged in MVVM ListBox Silverlight如何在 MVVM ListBox Silverlight 中实现 SelectionChanged
【发布时间】:2012-01-31 08:29:10
【问题描述】:

ListBox 控件没有实现 Command 属性。我必须将一些功能附加到 SelectionChanged 事件。有人知道我该怎么做吗?请帮帮我

【问题讨论】:

    标签: silverlight mvvm listbox command selectionchanged


    【解决方案1】:

    认为 Laurent Bugnion 的这篇文章将帮助您解决问题:

    http://geekswithblogs.net/lbugnion/archive/2010/05/19/handling-datagrid.selecteditems-in-an-mvvm-friendly-manner.aspx

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

    最好的问候和新年快乐! :)

    【讨论】:

      【解决方案2】:

      我建议使用RelayCommand。要么使用MVVM Light Toolkit,要么只使用Josh Smith's implementations 中的RelayCommandCommandManager 类。我个人只使用这两个类,所以我不需要整个工具包。

      虽然这肯定会奏效,但可能会有更简单的方法,具体取决于您正在做什么。将对象绑定到ListBoxSelectedValue 并监听该值的变化可能会更容易。

      【讨论】:

        【解决方案3】:

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

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

        ...

        public class ViewModel
        {
            public IEnumerable<Item> Items { get; set; } 
        
            private Item selectedItem;
            public Item SelectedItem
            {
                get { return selectedItem; }
                set
                {
                    if (selectedItem == value)
                        return;
                    selectedItem = value;
                    // Do logic on selection change.
                }
            }
        }
        

        【讨论】:

        • @Simsons 仅当您有办法绑定到多选时。我相信 SelectedItem 属性在多选期间会被忽略。
        • 比 Interaction.Triggers 方法更喜欢这种方法,因为它不需要引用 System.Windows.Interactions 和“schemas.microsoft.com/expression/2010/interactivity”,我在 Visual Studio 2010 中似乎总是遇到问题。不过,需要在 SelectedItem 绑定中添加一个 Mode=TwoWay。
        • @JeffBerry SelectedItem 默认为 TwoWay。 msdn.microsoft.com/en-us/library/…
        • 从概念的角度来看,从 getter 进行逻辑选择更改是否好?几天以来一直在问自己……
        【解决方案4】:

        基本上你有几个选择:

        1. 使用 ListBox 的 SelectedItem 属性绑定到后端(即视图模型中)的属性,并按照 Cameron MacFarland 的描述在 setter 中执行逻辑。
        2. 使用具有通用事件的第三方库来命令行为,例如 Pedro Lamas 发布的链接中的行为。
        3. 如果您不想使用第三方库或在属性设置器中编写逻辑在某种程度上是不可接受的,您可以为 ListBox 控件创建自己的行为。它将订阅控件的SelectionChanged 事件并执行命令(该命令可能是行为暴露的依赖属性)。

        【讨论】:

          【解决方案5】:

          这是您可以在 MVVM 应用程序中访问选择更改事件的方式 首先我告诉你命令属性只在按钮中有效,现在我们必须明确 在我们的 Selection Changed 事件中绑定该属性,例如列表框或组合框 在你的 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>
          

          为此,您必须添加 dll Syatem.Windows.Interactivity 现在你必须在你的 xaml 文件命名空间中添加引用,比如

           xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity"
          

          在您的 ViewModel 类中,您必须在 Con 结构中定义您的命令

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

          现在创建可以处理选择更改事件的 TestMethod 方法

           private void TestMethod(string parameter)
              {
                  MessageBox.Show(parameter);
              }
          

          我希望这可以帮助你。

          【讨论】:

          • 我更喜欢这种方式,因为我认为它更干净。
          猜你喜欢
          • 2016-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-24
          • 2011-08-02
          相关资源
          最近更新 更多