Как передать текущий экземпляр (отправитель) xaml (представление) в ViewModel - PullRequest
1 голос
/ 16 марта 2011

Мне нужен экземпляр view в viewmodel, чтобы манипулировать элементом view из ViewModel. Как я могу передать экземпляр текущего представления (отправителя) в ViewModel.

<UserControl...>
    <br>...<br>
    <Button x:Name="btnRemove" Width="100" Height="30" 
        Content="Remove" Margin="5" Visibility="Hidden"  
        Command="{Binding CellFrame.WidgetRemoveCommand, Mode=OneWay, Source={StaticResource Locator}}" 
        CommandParameter="{Binding Mode=OneWay}" />
    <br>...<br>
</UserControl>

Это передает экземпляр viewModel в WidgetRemoveCommand. Как пройти Intance Usercontrol.

Спасибо

Ответы [ 3 ]

1 голос
/ 17 марта 2011

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

//Parent
var model = new ChildControlViewModel();
var view  = new ChildControl(model);
Children.Add(view);
model.RemoveCommand = ()=>Children.Remove(view);

Очевидно, что это значительно упрощено, также я бы позаботился о том, чтобы у вас была фабрика управления представлениями, которая связана с моделью представления, даже если это в коде позади кажется мне ... неправильным.

Кроме того, вы можете использовать мессенджер и регистрироваться для сообщений в качестве альтернативы, что является приемлемым способом уведомления о действии модели представления. Например, я использую это, чтобы зарегистрировать представления view-> view для ползунка масштабирования в одном из моих проектов. Этот подход МОЖЕТ быть использован для удаления.

    public FlickrPhotoBrowserViewModel()
    {
        Photos = new ObservableCollection<FlickrPhotoViewModel>();
        Messenger.Default.Register<ZoomChangedMessage>(this, message => ImageSize = message.Content);
    }

Когда я создаю фото:

    public async Task CreatePhotoContainerAsync(string photoID, IImageSearchService searchService, IStreamService streamService)
    {
        if (photoID != null)
        {
            var Photo = new FlickrPhotoViewModel(photoID);

            Photo.ShowDetailsCommand = new RelayCommand(() =>
            {
                FlickrPhotoDataViewer.ShowPhoto(photoID, searchService, streamService);
            });



            // REMOVE CODE!!! ^_^
            Photo.RemovePhotoCommand= new RelayCommand(() =>
            {
                Photos.Remove(Photo);
                FlickrPhotoDataViewer.CleanupPhotoElement(Photo);
            });
            // REMOVE CODE!!! ^_^


            //update async collection from bound UI thread
            DispatcherHelper.CheckBeginInvokeOnUI(() => Photos.Add(Photo));

            var target = await searchService.GetPhotoThumbnailUriAsync(photoID);

            Photo.ImageStream = await streamService.GetStreamAsync(target);

            Debug.WriteLine("Image Download Complete " + target);
        }
        else
        {
            Debug.WriteLine("Image NULL " + photoID);
        }
    }
0 голосов
/ 17 марта 2011

В этом случае вы можете просто связать свойство Command в конструкторе пользовательского элемента управления. Иметь класс локатора, который хранит указатель на модель представления CellFrame.

btnRemove.Command = some_locator_class.static_method.WidgetRemoveCommand;
btnRemove.CommandParameter = this;

Модель представления CellFrame может иметь RelayCommand с именем WidgetRemoveCommand, как показано ниже:

RelayCommand<CellFrame> WidgetRemoveCommand 

Теперь эта команда реле имеет метод делегата, определенный ниже:

public void WidgetRemoveAction(CellFrame cell)
{
    // here you get it! 
}

Итак, хитрость в том, чтобы отправить 'this' в параметре команды.

Надеюсь, это поможет.

0 голосов
/ 16 марта 2011

Например, в MVVM Light есть опция для передачи EventArgs с помощью команды.В EventArgs есть отправитель, и из этого отправителя (родительский и т. Д.) Вы можете искать дерево.

Но в любом случае не очень хорошая идея связываться с представлением в viewmodel.Я бы поставил логику в коде View, это просто прекрасно.

...