我对DataBinding比较新,只是阅读它。 我想做的是以下几点:
我有一个包含许多子控件的StackPanel:
<StackPanel Orientation="Horizontal">
<TextBox x:Name="textbox1" Width="100">1</TextBox>
<TextBox x:Name="textbox2" Width="100">2</TextBox>
<TextBox x:Name="textbox3" Width="100">3</TextBox>
</StackPanel>
可以通过代码更改文本框的visibility
属性。
现在,如果所有TextBoxe
都设置为Visibility=Collapsed
,我还希望StackPanel.Visibility
设置为Collapsed
,但是如果显示一个或多个TextBoxe
{{ 1}},(Visibility=Visible)
也应设置为StackPanel.Visibility
。
这可以通过简单的DataBinding实现,还是必须在C#代码中实现此功能?
答案 0 :(得分:7)
我想不出通过数据绑定直接做到这一点的方法。
我个人会在视图后面有一个视图模型,并将视图DataContext设置为视图模型。
在视图模型中,我将有一个属性告诉视图是否所有文本框都已折叠。该属性将由代码设置。然后将stackpanel可见性绑定到该属性。
(该属性必须是依赖属性,否则视图模型必须实现INotifyPropertyChanged才能使视图自动更新)
答案 1 :(得分:5)
您是否考虑过将TextBoxes的可见性设置为Hidden
?这将“隐藏”为TextBox分配的空间。假设它们在StackPanel中没有其他控件,则它将不可见。
当然,这个解决方案可能会对您的实现做出一些天真的假设。
如果您需要更复杂的方案,我会尝试以下方法: 注意:这是伪造的 - 可能无法编译..
1)使用MultiBinding
<StackPanel>
<StackPanel.Visibility Converter={StaticResource visibilityConverter}>
<MultiBinding.Bindings>
<Binding ElementName="textBox1" Path="Visibility" />
<Binding ElementName="textBox2" Path="Visibility" />
<Binding ElementName="textBox3" Path="Visibility" />
</MultiBinding.Bindings>
</StackPanel.Visibility>
</StackPanel>
2)声明转换器
<Window.Resources>
<local:VisibilityConverter x:Key="visibilityConverter" />
</Window.Resources>
3)定义转换器
public class VisibilityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
Visibility text1Vis = (Visibility)values[0];
Visibility text2Vis = (Visibility)values[1];
Visibility text3Vis = (Visibility)values[2];
if (text1Vis == text2Vis == text3Vis == Visibility.Collapsed)
return Visibility.Collapsed;
return Visibility.Visible;
}
}