是否需要为简单的真/假操作创建转换器?

时间:2015-11-05 16:39:38

标签: c# wpf xaml checkbox data-binding

我询问binding to a control并了解到我可以绑定到ElementName。所以我做了。但是,我注意到我需要恢复被选中的值。有没有办法在没有转换器的情况下做到这一点?

<DatePicker Name="EndDate"
            Text="{Binding Path=EndDate}"
            IsEnabled="{Binding ElementName=NoEnd,Path=IsChecked}" />
<CheckBox Name="NoEndDate"
          Checked="Checked"
          Unchecked="Unchecked" />

我希望在 NoEndDate 的路径为false时设置为启用,反之亦然。

5 个答案:

答案 0 :(得分:2)

您可以将自定义样式与DataTrigger一起使用。这实现了你想要的,但使用转换器不是更容易吗?

<DatePicker Name="EndDate" Text="{Binding Path=EndDate}">
    <DatePicker.Style>
        <Style TargetType="{x:Type DatePicker}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=NoEndDate, Path=IsChecked}" Value="True">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DatePicker.Style>
</DatePicker>
<CheckBox Name="NoEndDate"/>

答案 1 :(得分:1)

简短的回答是

只要您想要绑定到 所需值的东西,就需要转换器。

答案 2 :(得分:1)

如果你想将转换一个布尔值从true变为false,反之亦然,你需要一个转换器,是的。这正是转换器在WPF中的用途。

我知道你对转换器很熟悉但只是为了完成这个帖子,用下面的Convert方法创建一个InverseBooleanConverter

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)  
  {  
       if (targetType != typeof(bool) && targetType != typeof(bool?))  
            throw new InvalidOperationException("The targetType must be a bool!");  
       if (value == null)  
            return null;  
       return !(bool)value; 
  } 

对ConvertBack方法执行相同操作。

您的XAML代码应如下所示:

<DatePicker Name="EndDate"
        Text="{Binding Path=EndDate}"
        IsEnabled="{Binding ElementName=NoEnd, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}}“ />
<CheckBox Name="NoEndDate"
      Checked="Checked"
      Unchecked="Unchecked" />

答案 3 :(得分:1)

XAML在绑定时没有对内联布尔表达式的开箱即用支持。

有点谷歌搜索确实出现QuickConverter

不能说我已经尝试过了,但应该让你write code like this

<CheckBox IsEnabled="{qc:Binding '!$P', P={Binding Path=ViewModel.SomeBooleanProperty}}" />

答案 4 :(得分:1)

下面的代码将为您完成工作。如果禁用CheckBox,它将启用Button,反之亦然。而且我经常使用这种方法,因为我发现它比使用动画和转换器容易。 它使用Blend SDK中提供的ChangePropertyAction行为。

<CheckBox x:Name="checkBox" Content="CheckBox" HorizontalAlignment="Right" Margin="0,171,147,0" VerticalAlignment="Top">
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="Checked" SourceObject="{Binding ElementName=checkBox}">
         <ei:ChangePropertyAction TargetObject="{Binding ElementName=button2}" PropertyName="IsEnabled"/>
       </i:EventTrigger>
       <i:EventTrigger EventName="Unchecked">
         <ei:ChangePropertyAction TargetObject="{Binding ElementName=button2}" PropertyName="IsEnabled" Value="True"/>
       </i:EventTrigger>
    </i:Interaction.Triggers>
</CheckBox>
<Button x:Name="button2" Content="Button" HorizontalAlignment="Right" Margin="0,145,140,0" VerticalAlignment="Top" Width="75"/>

就是这样,你不知道如何让它为你工作:

一个。包括以下命名空间:

    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

B中。添加对Microsoft.Expression.InteractionsSystem.Windows.Interactivity的引用 在我的系统上,这些可以在

中找到

C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries