2011-10-20 22 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