从绑定的ItemsControl访问我的视图

时间:2010-09-01 09:27:40

标签: c# .net wpf mvvm itemscontrol

我有一个典型的MVVM场景:我有一个ItemsControl绑定到ObservableCollection个StepsViewModels。我定义了一个DataTemplate,以便StepViewModel呈现为StepViews。在StepView中也是如此:我有一个ItemsControlObservableCollection的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控件?

2 个答案:

答案 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通知