2011-10-20 27 views
1

風格所以,我使用的是M-V-VM設計模式,有一些麻煩我綁定的正常工作作出WPF應用程序。控制基於一個DependencyProperty

我有一個自定義切換按鈕,我希望它的工作方式是這樣的:

  1. 當控制的器isChecked屬性設置爲true,那麼它應該查詢第二布爾(其中包含的ViewModel)也是如此。
  2. 如果是,背景顏色設置爲一種顏色,如果沒有的話將其設置爲不同的顏色。
  3. 如果是器isChecked假,使用標準顏色。

在XAML中,我有這樣的風格:

<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource CustomisableToggleButton}" x:Key="ValidatedTButton"> 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding IsChecked}" Value="True" /> 
       <Condition Binding="{Binding IsValid}" Value="True" /> 
      </MultiDataTrigger.Conditions> 
      <MultiDataTrigger.Setters> 
       <Setter Property="Background" Value="Turquoise" /> 
      </MultiDataTrigger.Setters> 
     </MultiDataTrigger> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding IsChecked}" Value="True" /> 
       <Condition Binding="{Binding IsValid}" Value="False" /> 
      </MultiDataTrigger.Conditions> 
      <MultiDataTrigger.Setters> 
       <Setter Property="Background" Value="LightCoral" /> 
      </MultiDataTrigger.Setters> 
     </MultiDataTrigger> 
     <DataTrigger Binding="{Binding IsChecked}" Value="False"> 
      <Setter Property="Background" Value="AliceBlue" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

(CustomisableToggleButton一個陷阱適用於的ToggleButtons所有樣式 - 據我所知這應該重寫是在所固有的觸發器 - 如果糾正我,我「M錯)

在控制類別:

public class ValidatedToggleButton : ToggleButton 
{ 
    public ValidatedToggleButton() 
     : base() { } 

    public static readonly DependencyProperty IsValidProperty = DependencyProperty.Register(
     "IsValid", typeof(bool), typeof(ValidatedToggleButton)); 

    public bool IsValid 
    { 
     get { return (bool)GetValue(IsValidProperty); } 
     set { SetValue(IsValidProperty, value); } 
    } 
} 

而控制的實際實現是:

<Window 
<!--standard window properties--> 
    xmlns:cc="clr-namespace:MVVM.CustomControls"> // namespace where 'ValidatedToggleButton' resides 

<!--other XAML code--> 

    <cc:ValidatedToggleButton 
     IsValid="{Binding Boolean1}" 
     Content="ToggleButton1" 
     IsChecked="{Binding ToggleButton1Checked}" 
     Grid.Row="6" Style="{StaticResource ValidatedTButton}" /> 

</Window> 

現在,問題是,它從來沒有檢查'Boolean1'值,除了一次啓動(使用斷點驗證)。我怎樣才能讓它在每次按下控件時檢查該值?

回答

1

除了Kent's Answer,驗證當Boolean1正在改變PropertyChanged事件越來越提高。

您可以通過在get方法插入斷點做到這一點。

2
<Condition Binding="{Binding IsChecked}" Value="True" /> 

這是在您的視圖模型(您的數據上下文)上尋找一個名爲IsChecked的屬性。你肯定不希望這樣的:固定您的XAML綁定

<Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True" /> 
+0

我沒有錯過,可惜沒有雪茄。無論如何,'IsChecked'似乎工作正常,只是'IsValid'似乎是導致問題。 –

+0

把這個答案應用到'IsValid'產生了一個有趣的結果 - 現在ToggleButton總是顯示爲無效顏色,而不是有效的顏色......奇怪。 –

+0

@KristianFenn用'IsValid'屬性做同樣的事情。現在看起來你正在檢查'ValidatingToggleButton.DataContext.IsValid'的值,我猜測它不存在。通過設置'RelativeSource'到'Self',你改變它來看看'ValidatingToggleButton.IsValid' – Rachel