【发布时间】: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 添加为命令? -
当然。将在几秒钟内完成。
-
如果
ContactList是ObservableCollection,那么您无需执行任何操作,向ObservableCollection添加/删除项目将相应地更新UI。