2011-03-29 86 views
3

編輯:所以,事實證明,這是在VM中的代碼問題(令人尷尬足夠的檢查一個屬性,總是返回true [重構會話之後]) - 我會認爲我會搗毀數據綁定,因爲這是通常的嫌疑人(至少對我來說)
謝謝你的所有幫助,並道歉浪費你的時間。
WPF DataTrigger/DataBinding失敗?

嗨,我試圖讓這只是改變文本顏色爲紅色或綠色取決於視圖模型中的布爾依賴項屬性。觸發器是問題所在......我想?

<TextBlock> 
    <TextBlock.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsNegativeChange}" Value="true"> 
        <Setter Property="TextBlock.Foreground" Value="Red" /> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding IsNegativeChange}" Value="false"> 
         <Setter Property="TextBlock.Foreground" Value="Green" /> 
        </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 

    <TextBlock.Text> 
     <MultiBinding StringFormat="{}{0} ({1})"> 
      <Binding Path="ReturnedData.Change" /> 
      <Binding Path="ReturnedData.ChangePercentage" /> 
      </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

的IsNegativeChange是視圖模型對象本身的成員,並且因此它不需要「ReturnedData」資格。

就目前而言,文字總是顯示爲綠色。 ViewModel根據輸入正確地返回true/false ..幫助!我錯過了什麼愚蠢的東西嗎?

[編輯用於格式化]

編輯,在調試窗口中,它說:

BindingExpression:路徑= IsNegativeChange;的DataItem = NULL;目標元素是'TextBlock'(Name =''); target property is'NoTarget'(type'Object')

是不是由?

+0

您的視圖模型是否實現INotifyPropertyChanged? – CodeNaked 2011-03-29 15:27:32

+0

不,但它是一個依賴屬性,所以我假設變更通知已經處理完畢...? – 2011-03-29 15:29:08

+0

我應該補充說,所有其他屬性工作正常。 – 2011-03-29 15:29:58

回答

1

觸發器看起來不錯,Visual Studio中的輸出窗口是否顯示任何綁定錯誤?

如果不是這種情況,觸發器的值被覆蓋,請參閱有關dependency property value precedence的文章以獲取更多信息。如果您將該值顯式設置爲綠色,觸發器將不會執行任何操作。

0

你或許可以廢除第二觸發像這樣:

<Style> 
    <Setter Property="TextBlock.Foreground" Value="Red" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.IsNegativeChange}" Value="false"> 
      <Setter Property="TextBlock.Foreground" Value="Green" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

這並不能解釋爲什麼一個作品和其他沒有,但。

+0

我試過了 - 沒有工作:( – 2011-03-29 15:42:41

+0

這聽起來像是非常接近解決方案,有時價值優先可能會非常棘手 – rrhartjr 2011-03-29 15:43:47

+0

@Mark - 更新了使用RelativeSource並直接鏈接到DataContext的答案,除此之外, d可能不得不發佈您的視圖模型的代碼 – CodeNaked 2011-03-29 15:49:59

0

我認爲你的問題可能是與元素內聯樣式。控制檯中的綁定錯誤消息表明綁定目標在您的樣式中被遮擋。但是,您提到使用綁定添加另一個Label元素將顯示正確的值。

我也會考慮轉換爲已知的默認樣式,而不是兩個相反的觸發器。

嘗試定義的TextBlock外面的風格 -

<Grid> 
    <Grid.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <Setter Property="TextBlock.Foreground" Value="Green" /> 
       <DataTrigger Binding="{Binding IsNegativeChange}" Value="True"> 
         <Setter Property="TextBlock.Foreground" Value="Red" /> 
        </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <TextBlock> 
     <TextBlock.Text> 
      <MultiBinding StringFormat="{}{0} ({1})"> 
       <Binding Path="ReturnedData.Change" /> 
       <Binding Path="ReturnedData.ChangePercentage" /> 
      </MultiBinding> 
     </TextBlock.Text> 
    </TextBlock> 
</Grid> 

希望幫助!

+0

Fyi,您提交了相同的答案兩次 – CodeNaked 2011-03-29 15:55:51

+0

謝謝,副本已被編輯和標記 – rrhartjr 2011-03-29 15:58:21