我有MainWindow
,当按下按钮时,ViewModel
中的方法被调用。
public void BtnOpenClick()
{
//DoStuff
VideoControl mediaplayer = new VideoControl
}
从我的视图中实例化一个新的Videocontrol
,这是一个用XAML
编写的用户控件。
我的问题是如何以usercontrol
方式将ViewModel
从MainWindow
返回MVVM
?
修改
我对MVVM模式产生了误解,我试图做的事情明显违反了模式。
现在我有一个解决方案在Mainwindow中我绑定到我的usercontrol(VideoControl)
<StackPanel>
<Local:VideoControl IconInfos="{Binding SourceVideos}"/>
</StackPanel>
我的ViewModel看起来像这样
class VideoControlViewModel : ViewModel
{
private ObservableCollection<Video> _Videos;
public ObservableCollection<Video> Videos
{
get { return _Videos; }
set { SetProperty(ref _Videos, value); }
}
}
我的模型只是我想在MediaElement中播放的文件的Uri
public class Video
{
public Uri FileName { get; set; }
}
在usercontrol中我有一个datatemplate和Some More XAML
<UserControl.Resources>
<DataTemplate x:Key="VideoTemplate">
<MediaElement x:Name="MediaPlayer" Source="{Binding FileName }"/>
</DataTemplate>
</UserControl.Resources>
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource="{Binding Videos}"
ItemTemplate="{StaticResource VideoTemplate}"
Grid.Row="1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</StackPanel>
在Code Behind中我有这段代码
VideoControlViewModel _vm;
public VideoControl()
{
InitializeComponent();
_vm = (VideoControlViewModel) VideoGrid.DataContext;
}
public ObservableCollection<Video> IconInfos
{
get { return (ObservableCollection<Video>)GetValue(IconInfosProperty); }
set { SetValue(IconInfosProperty, value); }
}
public static readonly DependencyProperty IconInfosProperty =
DependencyProperty.Register("IconInfos", typeof(ObservableCollection<Video>),
typeof(VideoControl), new PropertyMetadata(null, OnIconInfosSet));
private static void OnIconInfosSet(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((VideoControl)d)._vm.Videos = e.NewValue as ObservableCollection<Video>;
}
For Now当我调用一个按钮时,我可以将另一个Item添加到Obeservable集合中,并在主窗口中弹出一个带有所选Uri的媒体播放器。
答案 0 :(得分:0)
尝试将控件传递给内容:
public void BtnOpenClick()
{
//DoStuff
VideoControl mediaplayer = new VideoControl();
MainWindow.YourControl.Content = mediaplayer;
}