2012-04-26 17 views
1

我被困在一些東西上,並希望一個簡單的答案。首先,我有一個有多重綁定觸發器的主題。觸發器多重導入DataTrigger不工作?

<DataTrigger Value="True"> 
    <DataTrigger.Binding> 
    <MultiBinding Converter="{StaticResource MyConverter}" > 
     <Binding Path=".TemplatedParent" RelativeSource="{RelativeSource Self}" /> 
     <Binding Path="IsEnabled" RelativeSource="{RelativeSource Self}" /> 
    </MultiBinding> 
    </DataTrigger.Binding> 
    <Setter Property="Background" Value="{StaticResource NewBackgroundColor}" /> 
    <Setter Property="BorderBrush" Value="{StaticResource NewBorderBrushColor}" /> 
</DataTrigger> 

我的數據控制文本框,組合框有INotifyPropertyChanged的實施。

在處理過程中,在某些條件下,我想提出「IsEnabled」變化的事件,但實際上並沒有改變它的值。所以,多重綁定永遠不會被觸發。由於轉換器的第一個參數是控制對象本身,因此它永遠不會「改變」,所以它只是在那裏作爲轉換器工作的參數。

實際觸發觸發器的唯一方法就是像做

MyControl.IsEnabled = false; 
MyControl.IsEnabled = true; 

有一些其他方法來強制觸發多綁定數據觸發?

嘗試詳細闡述一下我的問題。我已經對基本控件(文本框,組合框,按鈕等)進行了分類以添加某些設置/功能等。對於它們的通用性,它們都支持「IMyCommonInterface」界面。無需重新定義整個「主題」(例如簡單的文本框),我希望有條件地更改顏色,如進行數據驗證,但不僅僅是簡單地改變這些示例屬性的顏色。

由於基本文本框沒有任何關於「IMyCommonInterface」的知識,也沒有定製屬性,因此我創建了一個轉換器類「MyConverter」,它將實際的控件對象作爲第一個參數。現在,coverter內,我可以做

if(values[0] is IMyCommonInterface) 

那麼我可以強制轉換爲界面並檢查所有任何特殊的病情,我希望在不必明確創建說..十幾觸發每個基於A + B或A + C或(A + B NOT C)或D等

所以,我不想有一堆不同的主題,一堆觸發器等,只是一個集中處理的元素。我正在研究其他方法,但是如果我碰到一個只拋出PropertyChanged事件的實例也不會強制觸發數據觸發器,我寧願找出現在仍然試圖理解所有的(例如)鉤子。淨有,而且你基本上可以指向幾乎任何東西。

+1

你確定'Path =「.TemplatedParent」'是正確的嗎?也許你想''Binding RelativeSource =「{RelativeSource TemplatedParent}」/>' – Vlad 2012-04-26 11:49:04

+0

@Vlad,值得注意的是,但是,這是正確的。當我學習多部分綁定時,我實際上發現這是偶然的。如果你通過「。」的路徑。它返回對象。由於該點是組合框的切換按鈕,因此.TemplatedParent會傳遞實際的整個組合框控件。再說一遍,否則,如果我強制IsEnabled爲false並返回true,那麼我知道它的「wired」可以。 – DRapp 2012-04-26 11:58:57

+0

這是一個非常有趣的問題 - 相當難解。我對你的問題是否有可能獲得你試圖通過這種觸發完成的細節。你的頭腦在你創建的問題的解決方案空間中。我想知道是否有另一種方法來獲得避免這個問題的效果? – 2012-04-26 21:12:15

回答

1

這只是一個想法...

既然你已經子類的基本控制。爲什麼不添加另一個屬性。您可以添加一個布爾的DependencyProperty(姑且稱之爲「IsTriggered」)以及該切換方法財產

public void ReEvaluateTrigger() 
{ 
    IsTriggered = !IsTriggered; 
} 

public static readonly DependencyProperty IsTriggeredProperty = 
     DependencyProperty.Register("IsTriggered", typeof(bool), typeof(ButtonEx), new FrameworkPropertyMetadata(false)); 

public bool IsTriggered 
{ 
    get { return (bool)GetValue(IsTriggeredProperty); } 
    set { SetValue(IsTriggeredProperty, value); } 
} 

然後在必要的時候,無論在什麼您的情況可能是你會在你的代碼做是調用myControl。

MyControl.ReEvaluateTrigger() 

這應該引起觸發重新評估:

...taken from your code with a change to binding to IsTriggered 
<Binding Path="IsTriggered" RelativeSource="{RelativeSource Self}" /> 

我把這個在我的快速測試,只是爲了看看的IsEnabled會切換(我知道這很簡單,但它只是一個快速測試) :

<Button Content="push to trigger enabled below" Click="Button_Click"/> 
<Sample:ButtonEx x:Name="ButtonToBeTriggered" IsEnabled="{Binding Path=IsTriggered, RelativeSource={RelativeSource Self}}" 
      Content="ButtonToBeTriggered" Width="100" Height="50" Margin="50"/> 

//where in code behind 
private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ButtonToBeTriggered.ReEvaluateTrigger(); 
    } 

在測試中,我擴展

公共類ButtonEx:按鈕

其中我創建了ReEvaluateTrigger()以及觸發器... 無論如何,只是一個想法!