【问题标题】:Refesh listbox from xaml从 xaml 刷新列表框
【发布时间】:2013-11-19 16:26:10
【问题描述】:

在我的 WPF MVVM 应用程序中,我目前正在尝试从按钮事件处理程序转移到命令。

我有一个表示联系人列表的列表框,此数据绑定到我的视图模型。

<ListBox Grid.Row="1" Grid.Column="0" x:Name="ContactListBox" Margin="5" BorderThickness="2"
      DisplayMemberPath="Name"
      IsSynchronizedWithCurrentItem="True"
      SelectionMode="Single">
          <ListBox.Style>
                <Style TargetType="ListBox">
                    <Style.Triggers>
                         <DataTrigger Binding="{Binding IsShowingFavorites}" Value="True">
                               <Setter Property="ItemsSource" Value="{Binding Path=FavContactList}" />
                               <Setter Property="SelectedItem" Value="{Binding Path=CurrentFavContact}" />
                          </DataTrigger>
                          <DataTrigger Binding="{Binding IsShowingFavorites}" Value="False">
                               <Setter Property="ItemsSource"  Value="{Binding Path=ContactList}" />
                               <Setter Property="SelectedItem" Value="{Binding Path=CurrentContact}" />
                          </DataTrigger>
                   </Style.Triggers>
               </Style>
         </ListBox.Style>
</ListBox> 

我还有一个添加新联系人的按钮:

<ToggleButton x:Name="AddFavs" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,5,0" Click="AddFavs_Click" >

现在我想摆脱我的AddFavs_Click

    /// <summary>
    /// Handler for Add click event
    /// </summary>
    /// <param name="sender">Not used</param>
    /// <param name="e">Not used</param>
    private void AddFavs_Click(object sender, RoutedEventArgs e)
    {
        _viewModel.AddFavorites();
        ContactListBox.Items.Refresh();
    }

使用 AddFavourites 命令。 到目前为止,我可以移动 AddFavorites();但是,作为命令,我的视图模型无权访问视图,因此我无法执行 ContactListBox.Items.Refresh();在我的视图模型中,这就是为什么当添加新联系人时,ContactListBox 没有正确更新。

我的猜测是从 XAML 以某种方式触发 Item.Refresh(),但我还没有找到解决方案。

【问题讨论】:

  • 您是否正在实施 INotifyPropertyChanged?
  • 是的,我愿意。但是,当我执行 RaisePropertyChanged 时,它不会立即更新我的列表框,而是只有当我单击列表中的其他项目时才会更新。
  • 尝试使用ItemsSource="{...., UpdateTriggerSource=PropertyChanged}" 。如果这不起作用,您能否编辑您的问题以包括您如何尝试将 AddRemoveFavs 添加为命令?
  • 当然。将在几秒钟内完成。
  • 如果ContactListObservableCollection,那么您无需执行任何操作,向ObservableCollection 添加/删除项目将相应地更新UI。

标签: c# wpf xaml mvvm listbox


【解决方案1】:

很多次我看到一个 WPF 开发人员试图在 XAML 上保存并实现一些可笑的数据共享视图或控件然后来到这里说这里发生了什么?。你们都让您的生活变得更加难以保存在一个小的 XAML 文件上??我敢肯定你会说那不是你在做什么,但不管怎样,我的建议都是一样的。

不要与不同的视图模型共享视图,尤其是不要与不同的数据源共享 UI 控件。如果您真的使用 MVVM 模式编写应用程序,那么正如 @sthotakura 所提到的,您根本不需要更新 UI...您将更改 数据 和 UI 会自动更新,这要归功于INotifyPropertyChanged 界面。

您还会发现隐藏和显示已在 XAML 中设置的其他 DataGrid 控件然后尝试在运行时更改数据绑定源要简单得多。

【讨论】:

  • 非常感谢您的反馈,我绝对同意您的观点,但是我不是应用程序的设计者,所以必须使用我所拥有的。
  • 将代码隐藏事件更改为命令是值得的更改。它也比使用代码隐藏事件更接近 MVVM...
  • 除了INotifyPropertyChanged,还有INotifyCollectionChanged,上面@sthotakura 的评论中提到过。 ObservableCollection 实现了这一点,简单地更改集合应该会导致列表框自动刷新。
  • 啊,刚刚和设计它的人讨论了所有的要点,如果它们在转移到指挥过程中造成了太多问题,就让一些事件处理程序保持原样
猜你喜欢
  • 2018-09-23
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
相关资源
最近更新 更多