Chr*_*ann 4 c# data-binding wpf xaml
我是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>
Run Code Online (Sandbox Code Playgroud)
可以通过代码更改文本框的可见性属性.现在,如果所有TextBox都设置为Visibility = Collapsed,我还希望StackPanel.Visibility设置为Collapsed,但如果显示一个或多个TextBox(Visibility = Visible),则StackPanel.Visibility也应设置为Visible.
这可以通过简单的DataBinding实现,还是必须在C#代码中实现此功能?
我想不出通过数据绑定直接做到这一点的方法.
我个人会在视图后面有一个视图模型,并将视图DataContext设置为视图模型.
在视图模型中,我将有一个属性告诉视图是否所有文本框都已折叠.该属性将由代码设置.然后将stackpanel可见性绑定到该属性.
(该属性必须是依赖属性,否则视图模型必须实现INotifyPropertyChanged才能使视图自动更新)
您是否考虑过将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>
Run Code Online (Sandbox Code Playgroud)
2)声明转换器
<Window.Resources>
<local:VisibilityConverter x:Key="visibilityConverter" />
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)