c # MVVM открыть новое окно с медиаэлементом в качестве элемента управления содержимым

У меня другая проблема с MVVM. Я хочу нажать кнопку и открыть новое окно, содержащее медиаэлемент в качестве элемента управления контентом. Окно должно открыться и запустить видео по ссылке, переданной конструктору. Вот мой соответствующий код:

ApplicationView.xaml:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:ApplicationViewModel}">
            <local:ApplicationView/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:MediaPlayerViewModel}">
            <local:MediaPlayerView/>
    </DataTemplate>
</Window.Resources>

РЕДАКТИРОВАТЬ: Это также ничего не меняет, если я не использую UserControl... была попытка исправить предупреждение, которое я получил здесь.

Здесь я должен сказать, что я получил предупреждение, но оно работает. Поскольку мои представления наследуются от окна, в нем говорится, что я не могу передать элемент окна элементу стиля. Не знаю, связано ли это с этим :P

MediaPlayerView.xaml:

<Grid HorizontalAlignment="Left" Width="500" Margin="0,0,-208,0" RenderTransformOrigin="0.50,0.50">
    <ContentControl Content="{Binding MediaElementObject}"/>
</Grid>

Теперь я нашел много решений для открытия окна в шаблоне MVVM, но единственное, что мне понравилось, это то, что я попытался реализовать:

    public class WindowHandler
    {
        public void ShowWindow(object dataContext, int height, int width)
        {
            Window window = new Window()
            {
                Content = dataContext,
                Width = width,
                Height = height
            };
            window.Show();
        }
    }

Код команды, привязанной к моей кнопке:

var windowHandler = new WindowHandler();
                windowHandler.ShowWindow(new MediaPlayerViewModel(directLink), 500, 500);

И конструктор MediaPlayerViewModel:

class MediaPlayerViewModel : INotifyPropertyChanged
{
    private Uri mediaSource;
    public MediaPlayerViewModel()
    {
        mediaElementObject = new MediaElement();
        mediaElementObject.LoadedBehavior = MediaState.Manual;
        mediaElementObject.MediaOpened += OnMediaOpened;
    }

    public MediaPlayerViewModel(string directLink) : this()
    {
        mediaSource = new Uri(directLink);
        mediaElementObject.Source = mediaSource;
        mediaElementObject.Play();
        OnPropertyChanged("MediaElementObject");
    }
/*...........*/
}

Последний мой MediaPlayerView.xaml.cs

public partial class MediaPlayerView : Window
{
    private MediaPlayerViewModel viewModel;
    public MediaPlayerView()
    {
        InitializeComponent();
        viewModel = new MediaPlayerViewModel();
        this.DataContext = viewModel;
    }
}

РЕДАКТИРОВАТЬ: ничего не изменится, если я установлю

this.DataContext = viewModel;

or

this.Content = viewModel;

но я думаю, что второй имеет право идти сюда, верно?

Теперь, если я нажму кнопку в главном окне, откроется новое окно, но оно покажет только

myNamespace.MediaPlayerViewModel

вместо воспроизведения моего mediaElement... Я думаю, это как-то связано с управлением содержимым, как упоминалось ранее, но я не знаю, как это исправить. Я имею в виду, если я не могу передать окно в элемент стиля, что мне тогда передать? Разве мое новое окно не должно наследоваться от окна? И что означает этот x:Type в элементе управления контентом? Я читал что-то о динамическом контроле контента, но думаю, что мне это не нужно в моем новом окне.

Надеюсь, я написал понятный пост, и кто-то может мне помочь :)

РЕДАКТИРОВАТЬ: Ну, теперь я почти уверен, что моя проблема связана с тем, как я привязываю свою ViewModel к моему представлению... Как я уже сказал и упомянул в комментариях, я пытался сделать так, как в Открытие нового окна в MVVM WPF. Но я думаю, что он не распознает связь моей модели представления с представлением.... Но почему? :С

Если я правильно понял, мой windowHandler с этим кодом

windowHandler.ShowWindow(new MediaPlayerViewModel(), 500, 500);

вызывает ShowWindow и создает новое окно с

Content = dataContext

Поскольку мы привязали MediaPlayerViewModel к MediaPlayerView, он должен автоматически отрисовывать правильное представление... но это не так: S

РЕДАКТИРОВАТЬ: я до сих пор не знаю, почему это не сработало.... попробовал это сейчас с интерфейсом IWindowFactory, как в другом потоке здесь, чтобы создать представление и открыть окно, как обычно... Было бы лучше с таким подходом ... может быть, кто-нибудь когда-нибудь сможет мне помочь: D


person syc    schedule 12.12.2016    source источник
comment
Я считаю, что контент не должен содержать ViewModel, он должен содержать иерархию элементов управления, которую вы хотите показать... ViewModel должен быть установлен как DataContext   -  person Yitzchak    schedule 13.12.2016
comment
Контент содержит медиаэлемент или что вы имеете в виду? И я прочитал это на stackoverflow. Этот код xaml должен назначать представление модели представления, чтобы программа автоматически использовала правильное представление для используемой модели представления. И, конечно же, я установил модель представления как Datacontext в своем представлении Media Player ^^   -  person syc    schedule 13.12.2016
comment
Из вашего кода я не вижу, является ли ViewModel классом представления, который можно отображать. Тот факт, что он создает экземпляр представления, не означает, что это представление! Итак, если вы выполните Content = ViewModel; Я не думаю, что это будет отображаться! Это должно быть что-то вроде Content = YourMediaElement;   -  person Yitzchak    schedule 13.12.2016
comment
Эй, я добавил тело класса MediaPlayerViewModel, и оно наследуется от INotifyPropertyChanged, если вы имеете в виду, что это отображается. Я также добавил код MediaPlayerView. И я назначил datacontext вместо контента.... Может быть, это так? попробую :Р   -  person syc    schedule 13.12.2016
comment
Вы никогда не должны использовать System.Windows.Controls в своей модели представления. Это признак неправильной реализации, и MediaElement находится в этом пространстве имен. Ваше новое окно должно быть новым ViewModel с View as Window, а затем вы создадите экземпляр viewModel и привяжете его к своему представлению.   -  person FCin    schedule 13.12.2016
comment
Я не понимаю... мое новое окно - это Viewmodel с представлением как Windows, и я пытаюсь связать его с моим представлением с помощью кода с кодом xaml. Я только что попробовал с пользовательским контролем из-за предупреждения. Я пытался использовать это решение из stackoverflow, которое часто упоминается здесь, поэтому я не понимаю, что вы имеете в виду, когда не используете элементы управления... вот ссылка: stackoverflow.com/questions/11431612/   -  person syc    schedule 13.12.2016
comment
отредактировал мой ответ с тем, что я пробовал сейчас. Ничего не менял :С   -  person syc    schedule 13.12.2016
comment
Вы создаете экземпляр mediaElementObject = new MediaElement(); в своей модели представления, которая является элементом структуры wpf. Если вы захотите в будущем изменить свой MediaElement на что-то другое, вам нужно будет изменить свою модель просмотра. Именно поэтому был создан MVVM. Поэтому вам не нужно изменять свою модель представления. Вы должны либо привязать событие воспроизведения к команде, либо создать событие в своей модели представления и получить к нему доступ в своем представлении.   -  person FCin    schedule 13.12.2016
comment
Я получил это из вопроса stackoverflow, где было сказано, что это не повлияет на mvvm, потому что я могу привязать свой медиаэлемент к любому представлению с помощью управления контентом... просто проще, чем запускать события для чего угодно... Я не знал, какой из них был лучший подход, но это выглядело намного проще: S, кроме того, что моя программа предназначена для воспроизведения видеопотоков по ссылке, которая когда-либо будет создаваться медиаэлементом или пользовательской вещью, наследующей медиаэлемент. Кроме того, я думал, что это также mvvm, что представление не имеет много логики/кода. Но вопрос в том, почему это не работает: в любом случае, спасибо за ваш пост.   -  person syc    schedule 13.12.2016
comment
Я буду использовать события и привязывать медиаэлемент, если у меня есть проект, в котором это в конечном итоге будет изменено;)   -  person syc    schedule 13.12.2016
comment
Я не думаю, что вам нужен этот <UserControl> в вашем DataTemplate. Посмотрите на это: stackoverflow.com/questions/ 25845689/   -  person FCin    schedule 13.12.2016
comment
Да, я пробовал без и не изменился. В этом потоке не упоминается, от чего наследуется представление. Посмотрите на мой пост. Я получаю предупреждение о том, что элемент окна не может быть помещен в элемент стиля. Пользовательский контроль был попыткой исправить это.   -  person syc    schedule 13.12.2016
comment
Отредактировал мой пост... поначалу я думаю, что привязка контента не проблема. Представление не рисуется, хотя оно привязано к моей ViewModel.   -  person syc    schedule 13.12.2016