2017-10-28 103 views
1

我有一个MainView - 它有一个属性“ViewModel” - 当我将此ViewModel更改为不同类型时,我将窗口上的datacontext更新为特定的viewmodel,然后我使用ContentControl和DataTemplate来更改一些内容 - 这一切都有效。基于视图模型类型的边界触发器不起作用

现在,我尝试创建一个触发器来改变边界的基础上,视图模型类型的背景 - 我想出了这一点:

<Border Background="#3f3f3f" CornerRadius="10"> 
    <Border.Style> 
     <Style TargetType="Border"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding}" Value="{x:Type viewmodels:AllBeadsViewModel}"> 
        <Setter Property="Background" Value="White"></Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
    <StackPanel Orientation="Vertical" VerticalAlignment="Center" Margin="10"> 
     <Image Height="32" Source="/Images/Icons/bookmark-1.png" Margin="0,0,0,5" /> 
     <TextBlock Text="All Beads" VerticalAlignment="Center" Foreground="White" /> 
    </StackPanel> 
</Border> 

我使用WPF督察,试图确保该datacontext是正确的(AllBeadsViewModel),并且setter被正确描述 - 所有似乎都匹配。我在这里做错了什么?

+0

如果没有一个好的[mcve]清楚地表明你正在尝试做什么,哪些不起作用,以及你想要什么,而不能确切知道一个好的答案是什么。但是,在您发布的代码中,您似乎将对象本身与'System.Type'的实例进行比较。除非你的对象是'Type',否则永远不会成功。也许你想为绑定写一个转换器,它在对象上调用'GetType()'(即将对象转换为它的类型)。那么比较就会有意义。 –

+0

@PeterDuniho谢谢你的回复。真的很难知道要在这个问题中输入多少信息。我可以链接我的整个源代码 - 但这只会造成太多的噪音。 所以我的Window.DataContext是一个类,AllBeadsViewModel或EditBeadViewModel - 基于它是哪一个,我想要一个边框切换背景色。所以是的,我正在检查类型。我明白你的观点。所以我做了一个转换器。首先我尝试了匹配值。GetType(){x:Type viewmodels:AllBeadsViewModel} - 那没有用 - 所以我尝试了匹配value.GetType()。Name到“AllBeadsViewModel” - 仍然没有效果 –

+0

还要记住,元素将覆盖任何尝试将其设置为样式。除了转换器之外,你还应该从'Border'元素声明中去掉'Background =“#3f3f3f”',并在样式中加入''。 –

回答

0

您发布的XAML有两个问题。

第一个问题是如何根据对象的类型设置触发器。您的<DataTrigger/>元素正在引用Binding属性中的当前数据上下文,然后引用Value属性中对象的类型。因此,这是要求WPF比较数据上下文对象本身System.Type的实例。由于你的数据上下文对象实际上不是一个类型,所以它永远不会触发。

要解决该问题,您需要一种机制来比较当前数据上下文对象的类型AllBeadsViewModel类型。像WPF一样,有几种不同的选择。但恕我直言,最简单的方法之一是为触发器的绑定编写一个IValueConverter,它只返回绑定值的GetType()的结果。

现在,做你贴仍然是基于触发器将不会更新边框的背景颜色的XAML,因为在<Border/>元素takes precedence over any setter found in a styleBackground属性的显式设置。为了解决这个问题,你将需要删除的明确的属性值赋值,并与在风格本身<Setter/>元素替代它:

<Border CornerRadius="10"> 
    <Border.Style> 
     <p:Style TargetType="Border"> 
      <Setter Property="Background" Value="#3f3f3f"/> 
      <!-- etc. --> 
     </p:Style> 
    </Border.Style> 
    <!-- etc. --> 
</Border> 

(你可以忽略我已经加入到<Style/>p: XML命名空间上述&hellip元件;这只是有因为堆栈溢出代码格式化为XML/XAML得到由不合格<Style/>元件混淆并停止格式化为XML,直到元件被闭合)

WPF Trigger won't set property if set in Element参见讨论该第二方面/问题。你的XAML。

相关问题