2017-10-28 102 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。

相關問題