C# MVVM открыть новое окно с медиаэлементом в качестве contentcontrol

У меня другая проблема с 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... была попытка исправить предупреждение, которое я получил здесь.

Здесь я должен сказать, что получил предупреждение, но оно работает. Так как мои представления наследуются от Window, он говорит, что я не могу передать элемент окна элементу стиля. Не знаю, имеет ли это какое-то отношение к этому: 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;

или же

this.Content = viewModel;

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

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

myNamespace.MediaPlayerViewModel

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

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

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

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

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

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

Content = dataContext

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

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

0 ответов

Другие вопросы по тегам