Доступ к моим представлениям из привязанного ItemsControl - PullRequest
1 голос
/ 01 сентября 2010

У меня типичный сценарий MVVM: у меня ItemsControl привязан к ObservableCollection StepsViewModels.Я определяю DataTemplate так, чтобы StepViewModels отображались как StepViews.То же самое происходит в StepView: у меня есть ItemsControl для ObservableCollection ParameterViewModels с DataTemplate, чтобы отобразить их как ParameterViews.

Моя проблема: я должен обновить ItemsControl для отображения элементовдобавлены и удалены элементы.Я могу обновить ItemsControl с помощью StepViews, потому что у меня есть доступ к нему и я могу вызвать ItemsControl.Items.Refresh ().Но как я могу получить доступ к StepViews, чтобы я мог вызвать метод Refresh?ItemsControl Items - это 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>

Как получить доступ к элементам управления StepView, которые визуализируют элементы stkStepContent?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

если у вас есть ObservableCollection, то добавление и удаление элементов должно обновляться автоматически.Но если вы только что обновили свойство в своем StepsViewModel, то StepsViewModel должен предупредить об обновлении либо путем реализации интерфейса INotifyPropertyChanged, либо путем наследования от DependencyObject и использования взамен свойств Dependency.

В любом случае, если вы действительноЕсли вы хотите иметь возможность вручную обновлять вашу коллекцию, используйте CollectionViewSource в вашей ViewModel.Затем вызовите метод View.Refresh () вашего CollectionViewSource.

1 голос
/ 01 сентября 2010

Чтобы получить доступ к вашим представлениям в коде, вы можете использовать DataContext элемента управления и привести его к соответствующему представлению.Например:

ObservableCollection<StepViewModel> vmCollection = 
    stkStepContent.DataContext as ObservableCollection<StepViewModel>;

foreach(StepViewModel vm in vmCollection)
{
    vm.Refresh();
}

РЕДАКТИРОВАТЬ: содержит ли StepViewModel второй ObservableCollection с элементами, которые вы пытаетесь обновить?Если это так, вы можете подключить событие PropertyChanged, чтобы при обновлении внутренней ObservableCollection вызывалось уведомление PropertyChanged для StepViewModel

...