0

In XAML I can set TwoWay binding to the local settings using the following

<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}" />

Is it possible to introduce rules to the binding in XAML so that if checkBoxSaveSettings.IsChecked=true then controls will have twoway binding but if checkBoxSaveSettings.IsChecked=false then the binding mode is another option?

4

2 回答 2

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它勾选其他一些。我建议IsEnabledcheckBoxSaveSettings.IsChecked这样绑定:

<TextBox 
    Text="{Binding Source={x:Static local:Settings.Default}, Path=TextXYZ, Mode=TwoWay}"
    IsEnabled="{Binding ElementName=checkBoxSaveSettings, Path=IsChecked}"/>
于 2013-09-25T19:31:00.110 回答
1

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

<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 上合并一个设置器,但如果其他条件为真,则仅将传递的值应用于私有 _TextXYZ。其他条件将绑定到复选框 IsChecked。这应该在 ViewModel 而不是对象类中完成,但它可以在任何一个中工作。

于 2013-09-25T18:58:10.050 回答