XAML与规则绑定

时间:2013-09-25 18:50:36

标签: c# wpf xaml binding

在XAML中,我可以使用以下

将TwoWay绑定设置为本地设置
<TextBox
    Name="TextXYZ"  
    Text="{Binding Source={x:Static local:Settings.Default}, 
            Path=TextXYZ, 
            Mode=TwoWay}" />
<CheckBox Content="" 
    Name="checkBox1" 
    IsChecked="{Binding Source={x:Static local:Settings.Default}, 
            Path=checkBox1, 
            Mode=TwoWay}" />
<CheckBox Content="" 
     Name="checkBoxSaveSettings" 
     IsChecked="{Binding Source={x:Static local:Settings.Default}, 
     Path=checkBoxSaveSettings, Mode=TwoWay}" />

是否可以在XAML中为绑定引入规则,以便如果checkBoxSaveSettings.IsChecked=true那么控件将具有双向绑定但是如果checkBoxSaveSettings.IsChecked=false则绑定模式是另一种选择?

2 个答案:

答案 0 :(得分:2)

您可以使用DataTrigger来实现您想要的效果:

<TextBox>
   <TextBox.Style>
      <Style TargetType="{x:Type TextBox}">
         <Setter Property="Text" Value="{Binding Source={x:Static local:Settings.Default}, Path=TextXYZ, Mode=OneWay}"/>
         <Style.Triggers>
            <DataTrigger Binding="{Binding Source={x:Static local:Settings.Default}, Path=checkBoxSaveSettings, Mode=OneWay}" Value="True">
               <Setter Property="Text" Value="{Binding Source={x:Static local:Settings.Default}, Path=TextXYZ, Mode=TwoWay}"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBox.Style>
</TextBox>

然而,您的方法对用户来说听起来有些混乱,因为您可以更改控制值,但只有在其他CheckBox选中时才会生效。我建议将IsEnabled绑定到checkBoxSaveSettings.IsChecked,如下所示:

<TextBox 
    Text="{Binding Source={x:Static local:Settings.Default}, Path=TextXYZ, Mode=TwoWay}"
    IsEnabled="{Binding ElementName=checkBoxSaveSettings, Path=IsChecked}"/>

答案 1 :(得分:1)

不是直接的,但有选择。这只是一个。在绑定上创建转换器。对于converter参数,请传入复选框选中的值。

<TextBox
    Name="TextXYZ"  
    Text="{Binding Source={x:Static local:Settings.Default}, 
            Path=TextXYZ, 
            Converter={StaticResource foo},
            ConverterParameter = {Binding ElementName="checkBoxSaveSettings", Path="IsChecked",
            Mode=TwoWay}" />

然后创建一个名为“foo”的转换器(无论你想要什么)。在其中,如果参数为true,则返回传入的值。如果参数为false,则可以返回任何所需内容,包括Settings.Default.TextXYZ值,这样就不会发生任何变化。

另一种可能的选择是在TextXYZ上加入一个setter,但只有在其他条件为真时才将传递的值应用于private _TextXYZ。其他条件将绑定到复选框IsChecked。这应该是在ViewModel而不是对象类中完成的,但它可以在任何一个中完成。