MVVM - 在网格中添加现有用户控件(XAML)

时间:2014-08-19 09:09:13

标签: c# xaml mvvm windows-store-apps

我正在开发Windows 8.1 apps

我正在关注MVVM模式

我在应用程序中有一个网格

<Grid Name="g1">

其中需要添加现有的用户控件。

<UserControl
    x:Class="CaptureApp.UIComponents.PlayVideo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CaptureApp.UIComponents"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">

    <Grid>
        <MediaElement Name="MediaPlay" >

        </MediaElement>
    </Grid>
</UserControl>

Since View (XAML) is not allowed to know the Control.

实现它的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

评论中的wordpress博客使用了数据触发器,这在Windows应用商店中并不存在。

如果我正确理解了您的问题,那么您正试图在网格中有条件加载视图,这样当没有用户控件的数据时,它就不会在网格中呈现?

你可以通过使用

来实现这一目标
<ContentControl Content="{Binding PropertyOnViewModel}" ContentTemplateSelector="{StaticResource SomeContentTemplateSelector}" />. 

public class SomeContentTemplateSelector : DataTemplateSelector
{
  public DataTemplate SomeTemplate {get;set;}

  protected override DataTemplate SelectTemplate(object item, DependencyObject container)
  {
    if (item is null)
      return null;
    return SomeTemplate;
  }
}

然后在DataTemplate中,将您的UserControl作为孩子。当没有内容绑定到ContentControl时,这将不显示任何内容,否则将显示提供的DataTemplate。您需要在包含此ContentControl内容的主要ViewModel中拥有一个属性,但是,只需要fyi。

编辑:如果你动态添加多个项目,那么你需要一个ObservableCollection&lt;&gt; ViewModel上的属性,并使用ItemsControl而不是ContentControl。