如何从ViewModel WPF将用户控件返回到主窗口

时间:2017-07-13 13:01:57

标签: c# wpf xaml mvvm user-controls

我有MainWindow,当按下按钮时,ViewModel中的方法被调用。

public void BtnOpenClick()
{
     //DoStuff
     VideoControl mediaplayer = new VideoControl
}

从我的视图中实例化一个新的Videocontrol,这是一个用XAML编写的用户控件。

我的问题是如何以usercontrol方式将ViewModelMainWindow返回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的媒体播放器。

1 个答案:

答案 0 :(得分:0)

尝试将控件传递给内容:

    public void BtnOpenClick()
    {
         //DoStuff
         VideoControl mediaplayer = new VideoControl();

         MainWindow.YourControl.Content = mediaplayer;
    }