У меня другая проблема с 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
System.Windows.Controls
в своей модели представления. Это признак неправильной реализации, иMediaElement
находится в этом пространстве имен. Ваше новое окно должно быть новым ViewModel с View as Window, а затем вы создадите экземпляр viewModel и привяжете его к своему представлению. - person FCin   schedule 13.12.2016mediaElementObject = new MediaElement();
в своей модели представления, которая является элементом структуры wpf. Если вы захотите в будущем изменить свойMediaElement
на что-то другое, вам нужно будет изменить свою модель просмотра. Именно поэтому был созданMVVM
. Поэтому вам не нужно изменять свою модель представления. Вы должны либо привязать событие воспроизведения к команде, либо создать событие в своей модели представления и получить к нему доступ в своем представлении. - person FCin   schedule 13.12.2016<UserControl>
в вашемDataTemplate
. Посмотрите на это: stackoverflow.com/questions/ 25845689/ - person FCin   schedule 13.12.2016