2017-05-08 59 views
-1

我知道已经存在一些问题,但我无法解决他们的问题。使用数据模板切换图像

问题:我尝试使用数据模板更改图像,但仅显示默认图像。

代码: 我的XAML代码是这样的:

<Window.Resources> 
    <DataTemplate x:Key="MultiTemplate"> 
     <Image Height="17" Width="17"> 
      <Image.Style> 
       <Style TargetType="{x:Type Image}"> 
        <Setter Property="Source" Value="{svg2Xaml:SvgImage VideoControllerTester;component/Resources/Start.svg}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding MultiTrigger}" Value="start"> 
          <Setter Property="Source" Value="{svg2Xaml:SvgImage VideoControllerTester;component/Resources/Start.svg}"/> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding MultiTrigger}" Value="stop"> 
          <Setter Property="Source" Value="{svg2Xaml:SvgImage VideoControllerTester;component/Resources/Stop.svg}"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 
    </DataTemplate> 
</Window.Resources> 

<ContentControl ContentTemplate="{DynamicResource MultiTemplate}"/> 

在后面的代码,我设置MultiTrigger = “启动” 或 “停止”。

问题:我可以使用内容控制显示图像吗?或者我用数据模板做一些愚蠢的事情?

编辑:

public string MultiTrigger 
    { 
     get { return _multiTrigger; } 
     set 
     { 
      _multiTrigger = value; 
      RaisePropertyChanged(); 
     } 
    } 
+1

ContentControl的DataContext应设置为具有MultiTrigger属性的对象。 MultiTrigger属性设置器应该触发一个PropertyChanged事件。 – Clemens

+0

......或者,如果'MultiTrigger'是你窗口类的一个属性,你必须使用'RelativeSource = {RelativeSource AncestorType = Window}'来绑定它。 –

+0

除此之外,您实际上并不需要具有DataTemplate的ContentControl。您还可以将图像样式作为资源并直接将其应用于图像控件。 – Clemens

回答

0

假设有一个MainViewModel类与MultiTrigger属性(BTW是一个奇怪的属性名。),你的视图模型类的实例分配给主窗口的DataContext,无论是在后面的代码:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new MainViewModel(); 
} 

或者在XAML:

<Window.DataContext> 
    <local:MainViewModel/> 
</Window.DataContext> 

然后你会宣称图像风格作为一种资源:

<Window.Resources> 
    <Style TargetType="Image" x:Key="ImageStyle"> 
     <Setter Property="Source" Value="{svg2Xaml:SvgImage VideoControllerTester;component/Resources/Start.svg}"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding MultiTrigger}" Value="stop"> 
       <Setter Property="Source" Value="{svg2Xaml:SvgImage VideoControllerTester;component/Resources/Stop.svg}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

,并将其应用到图像控制:

<Image Style="{StaticResource ImageStyle}"/> 

然后某处主窗口的代码,通过直接访问更改属性值的背后查看模型实例如下:

((MainViewModel)DataContext).MultiTrigger = "stop";