zoukankan      html  css  js  c++  java
  • MVVM Light 使用心得之 ListBox.SelectedItem

    如图:

    假设左边的用户列表代码如下:

                <ListBox Grid.Row="1" Grid.Column="0" Grid.RowSpan="10" Margin="5,2"
    ItemsSource
    ="{Binding Path=Staffs}"
    SelectedItem
    ="{Binding Path=SelectedStaff, Mode=TwoWay}"
    IsEnabled
    ="{Binding Path=IsEnabled}">
    ......

    看起来很不错,但是实际上,如果选择了其中一个用户,修改用户名,然后直接选择另一个用户,此时被修改的用户名其实并没有修改成功

    因为其中牵涉到了代码执行顺序的问题。那么怎么办呢?很简单,不要直接绑定 SelectedItem,而使用 Trigger 绑定 SelectionChanged 事件。

    <UserControl 

    ......

    xmlns:i
    ="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:cmd
    ="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.SL5"

    ......
    >

    ......

    <ListBox Grid.Row="1" Grid.Column="0" Grid.RowSpan="10" Margin="5,2"
    ItemsSource
    ="{Binding Path=Staffs}"
    SelectedItem
    ="{Binding Path=SelectedStaff}"
    IsEnabled
    ="{Binding Path=IsEnabled}">
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
    <cmd:EventToCommand Command="{Binding SelectedStaffChangeCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
    </i:Interaction.Triggers>

    然后 VM 那边这样写

            #region SelectedStaffChangeCommand

    private RelayCommand<SelectionChangedEventArgs> _selectedStaffCmd = null;

    /// <summary>
    /// 获取 SelectedStaffChange 命令。
    /// </summary>
    public ICommand SelectedStaffChangeCommand
    {
    get
    {
    if (_selectedStaffCmd == null)
    {
    _selectedStaffCmd = new RelayCommand<SelectionChangedEventArgs>(OnInvokeSelectedStaffChangeCommand);
    }

    return _selectedStaffCmd;
    }
    }

    private void OnInvokeSelectedStaffChangeCommand(SelectionChangedEventArgs e)
    {
    BackgroundWorker bgw = new BackgroundWorker();
    bgw.RunWorkerCompleted += (s, a) =>
    {
    this.SelectedStaff = e.AddedItems.Cast<Staff>().FirstOrDefault();
    };
    bgw.RunWorkerAsync();
    }

    #endregion

    我们使用 BackgroundWorker 把修改 SelectedStaff 的时间拖后,这样就好了。

    并且当我们在 VM 中对 SelectedStaff 进行改变时,前端会随即响应。

    不建议直接在 SelectedStaff 属性中使用 BackgroundWorker 来将 SelectedStaff 值的改变拖后。仔细想想为什么~。~

  • 相关阅读:
    开启mysql远程访问的知识点
    U850EAI二次开发说明,用友EAI二次开发说明下载
    U8界面按钮二次开发手册,用友界面二次开发手册.pdf下载
    用友二次开发,用友EAI案例分析
    正则表达式在线测试相关网站
    用友EAI企业应用集成使用手册U8EAI手册2006年下载
    用友EAI企业应用集成使用手册U8EAI手册2005年下载
    U8EAI企业应用集成培训,用友EAI培训下载
    如何使用批处理,遍历指定目录下的文件。
    hdu 1021 数学水题 枚举法
  • 原文地址:https://www.cnblogs.com/softcat/p/2383652.html
Copyright © 2011-2022 走看看