【问题标题】:XAML binding with rulesXAML 与规则绑定
【发布时间】:2013-10-01 12:21:51
【问题描述】:

在 XAML 中,我可以使用以下方法将双向绑定设置为本地设置

<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 则绑定模式是另一种选择?

【问题讨论】:

    标签: c# wpf xaml binding


    【解决方案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”的转换器(无论你想要什么)。在其中,如果参数为真,则返回传入的值。如果参数为假,则可以返回任何你想要的值,包括 Settings.Default.TextXYZ 值,所以没有任何变化。

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

    【讨论】:

      【解决方案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}"/>
      

      【讨论】:

      • 我一直希望使用当前的控件值,但是,checkBoxSaveSettings.IsChecked=true 是一个设置,用于确定更改的控件值是否在更改时保存在设置中。
      • 没关系。如果您有办法获得当前控制值,那么第一个解决方案应该有效
      猜你喜欢
      • 2018-03-13
      • 2011-02-28
      • 1970-01-01
      • 2014-08-11
      • 2016-07-31
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多