我有一个典型的MVVM场景:我有一个ItemsControl
绑定到ObservableCollection
个StepsViewModels。我定义了一个DataTemplate,以便StepViewModel呈现为StepViews。在StepView中也是如此:我有一个ItemsControl
到ObservableCollection
的ParameterViewModels和一个DataTemplate,将它们渲染为ParameterViews。
我的问题是:我必须刷新ItemsControl
以呈现添加的项目并删除项目。我可以使用StepViews刷新ItemsControl
,因为我可以访问它并可以调用ItemsControl.Items.Refresh()。但是如何访问StepViews以便我可以调用Refresh方法? ItemsControl项目是StepViewModels ...
以下是代码:
<UserControl x:Class="mylib.EditorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:mylib">
<UserControl.Resources>
<DataTemplate DataType="{x:Type my:StepViewModel}">
<my:StepView HorizontalAlignment="Stretch"/>
</DataTemplate>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="27"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="1" VerticalAlignment="Top">
<StackPanel Orientation="Vertical">
<TextBlock Name="lblHelpRefresh" Margin="0 7 0 7" Visibility="{Binding HelpVisible}"
VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="9pt" Foreground="#949494"
Text="Please click refresh to reload this list"/>
<ItemsControl Name="stkStepContent"
ItemsSource="{Binding Steps}"/>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
如何访问呈现stkStepContent项的StepView控件?
答案 0 :(得分:2)
如果您有ObservableCollection,则添加和删除项目应自动刷新。但是,如果您刚刚更新了StepsViewModel中的属性,那么StepsViewModel应该是通过实现INotifyPropertyChanged接口或继承DependencyObject并使用Dependency属性来提醒更新的那个。
无论如何,如果您真的想要手动刷新集合,请在ViewModel中使用CollectionViewSource。然后调用CollectionViewSource的View.Refresh()方法。
答案 1 :(得分:1)
要在代码隐藏中访问您的视图,您可以使用控件的DataContext并将其转换为适当的视图。例如:
ObservableCollection<StepViewModel> vmCollection =
stkStepContent.DataContext as ObservableCollection<StepViewModel>;
foreach(StepViewModel vm in vmCollection)
{
vm.Refresh();
}
编辑:StepViewModel是否包含第二个ObservableCollection,其中包含您尝试刷新的项目?如果是这样,您可以连接一个PropertyChanged事件,以便在内部ObservableCollection更新时触发StepViewModel上的PropertyChanged通知