2012-12-18 33 views
1

我已经有了一种表单,可以从数据集中获取数据行以绑定其所有元素。其中之一是一个布尔,但我希望这个布尔是由一个是/否组合框表示。所以我做了this,效果很好。将绑定可见性转换为是/否组合框与转换器

我也想绑定几个元素的可见性到这个布尔字段。当表单加载时,可见性的初始设置起作用。当我更改组合框选择时,组合框的ConvertBack()方法被调用(即设置绑定值)。但是其他可见性绑定到同一领域的元素不会被更新。我在转换方法中设置了断点,并且它们永远不会像调用窗体时那样调用。

以下是有关XAML:

<ComboBox SelectedIndex="{Binding Path=[Adequate], Converter={StaticResource b2iConverter}}" Name="cb_Adequate" > 
    <ComboBoxItem>Yes</ComboBoxItem> 
    <ComboBoxItem>No</ComboBoxItem> 
</ComboBox> 

<Label Content="Reason:" 
     VerticalAlignment="Center" 
     Visibility="{Binding Path=[Adequate], 
     Converter={StaticResource b2vConverterInverse}}"/> 

<TextBox Text="{Binding Path=[NotAdequateReason]}" 
     Visibility="{Binding Path=[Adequate], 
      Converter={StaticResource b2vConverterInverse}}"/> 
  • “足够” 是布尔场
  • b2iConverter只是booleanToIndexConverter(从上面的链接)
  • b2vConverterInverse仅仅是一个倒置的布尔能见度转换器(我希望当Adequate为FALSE或0时显示标签和文本框)。

感谢您的帮助。我可以发布更多的代码,如果需要的话,我想这个问题是在XAML ...

编辑:显然这是不可能的XAML(见下Greg的职位),所以我只是做代码:

private void cb_Adequate_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Visibility vis = (cb_Adequate.SelectedItem as ComboBoxItem).Content.ToString() == "Yes" ? Visibility.Collapsed : Visibility.Visible; 
    label_Reason.Visibility = tb_AdequateDesc.Visibility = vis; 
} 
+0

您是否尝试过明确设置绑定模式?你也可以尝试去除'Path'的方括号'[]',我不认为这是必要的。 – WildCrustacean

回答

1

如果您希望UI元素在数据属性更改时更改状态,则需要在数据类上实现INotifyPropertyChanged。

这意味着您不能将DataRow用于您的目的。您必须创建一个新类,然后在运行时使用DataRow中的值填充它,然后将该对象绑定到您的视图。

+0

或者只是在代码后面做?似乎更容易。我正在寻找一个XAML解决方案。 – akevan

+0

不存在仅限XAML的解决方案,因为只有在触发NotifyPropertyChanged事件时,XAML属性才会自动更新。 DataRow不会发生这种情况。您可以在代码隐藏方面做到这一点,但数据绑定更加简洁,并推荐用于WPF/XAML解决方案。 –

+0

好的,如果用XAML无法实现,那么实现组合框的OnSelectionChanged并设置其可见性不是更容易吗?似乎更少的代码... – akevan