2010-05-31 57 views
2

我有一個WPF觸發器的問題。在我的應用程序中,我使用了一個多觸發器,但希望實現當觸發器的條件變爲真時保持不變並在觸發器的條件變爲錯誤時不會失效。 是否有可能實現我想要的?WPF觸發器值是否可以持續超出觸發條件?

在此先感謝。

+0

對不起,我犯了一個錯誤,並遺漏了一個字。所以再次提出這個問題: 在我的應用程序中,我使用了一個多觸發器,但希望實現當觸發器的條件變爲真時保持不變並在觸發器的條件變爲錯誤時不會失效。是否有可能實現我想要的? – Zoliqa 2010-05-31 13:06:18

回答

3

觸發器沒有任何內存:只要觸發器不適用,觸發器的設置器就不適用。你想要一個條件,「鎖定」一旦設置。這可以用一個非常簡單和通用的代碼來完成。

首先,您需要一個可以「鎖定」的附加屬性。下面是與每當「DoLock」屬性設置爲真,並保持從這種方式然後在「IsLocked」附加屬性的簡單類:

public class LockingProperty : DependencyObject 
{ 
    // IsLocked 
    public static bool GetIsLocked(DependencyObject obj) { return (bool)obj.GetValue(IsLockedProperty); } 
    public static void SetIsLocked(DependencyObject obj, bool value) { obj.SetValue(IsLockedProperty, value); } 
    public static readonly DependencyProperty IsLockedProperty = DependencyProperty.RegisterAttached("IsLocked", typeof(bool), typeof(LockingProperty)); 

    // DoLock 
    public static bool GetDoLock(DependencyObject obj) { return (bool)obj.GetValue(DoLockProperty); } 
    public static void SetDoLock(DependencyObject obj, bool value) { obj.SetValue(DoLockProperty, value); } 
    public static readonly DependencyProperty DoLockProperty = DependencyProperty.RegisterAttached("DoLock", typeof(bool), typeof(LockingProperty), new PropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => { SetIsLocked(obj, true); } 
    }); 
} 

現在你可以使用兩個單獨的觸發器仿效鎖定扳機:

<Triggers> 
    <Trigger ... your trigger conditions here ...> 
    <Setter Property="my:LockingProperty.DoLock" Value="true" /> 
    </Trigger> 
    <Trigger Property="my:LockingProperty.IsLocked" Value="true" /> 
    ... your setters here ... 
    </Trigger> 
</Triggers> 

請注意,此示例中的第一個觸發器可以是觸發器,DataTrigger,MultiTrigger或MultiDataTrigger - 無論您需要表達觸發條件。

+0

嗨雷和感謝您的答案。我真的很喜歡它,在我看來,它確實做了我想要的,但是我意識到,爲了我的需要,最好在ViewModel類中實現邏輯,而不是在XAML中進行綁定。無論如何,感謝您的答案,這可能對未來有所幫助。 – Zoliqa 2010-06-08 07:18:54

+0

是的,在ViewModel中實現這種行爲通常比使用觸發器更好。我喜歡WPF的一點是它有很大的靈活性。很少有其他技術有能力創建這樣的「鎖定觸發」功能,或者真正處理ViewModel的問題。所以無論你如何實施你的解決方案,你都會贏。 – 2010-06-08 22:07:49