Wpf 如何基于文本框值绑定控件(StackPanel)的可见性?
在WPF MVVM应用程序中,我有一个Wpf 如何基于文本框值绑定控件(StackPanel)的可见性?,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,在WPF MVVM应用程序中,我有一个TextBoxTxtFruit和两个StackPanelsstackPanelApple和stackPanelOrange 这就是应该发生的事情: 如果txtFruit.Text是“Apple”,则stackPanelApple将可见 如果txtFruit.Text更改为“橙色”,则将显示stackPanelOrange 如果txtFruit.Text为空或其他内容,则面板的可见性应为折叠 如何在视图模型中实现这一点 <TextBox x:Name
TextBox
TxtFruit
和两个StackPanel
sstackPanelApple
和stackPanelOrange
这就是应该发生的事情:
- 如果
是“Apple”,则txtFruit.Text
将可见stackPanelApple
- 如果
更改为“橙色”,则将显示txtFruit.Text
stackPanelOrange
- 如果
为空或其他内容,则面板的txtFruit.Text
应为可见性
折叠
<TextBox x:Name="TxtFruit" Text="{Binding CurrentFruit}"/>
<StackPanel>
<StackPanel x:Name="stackPanelApple" Orientation="Horizontal" Margin="0,0,0,20" >
<TextBox x:Name="AppleProperty1" Margin="0,0,10,0" Text="{Binding AppleProperty1}" />
<TextBox x:Name="AppleProperty2" Margin="10,0,10,0" Text="{Binding AppleProperty2}" />
</StackPanel>
<StackPanel x:Name="stackPanelOrange" Orientation="Horizontal" Margin="0,0,0,20" >
<TextBox x:Name="OrangeProperty1" Margin="0,0,10,0" Text="{Binding OrangeProperty1}" />
<TextBox x:Name="OrangeProperty1" Margin="10,0,10,0" Text="{Binding OrangeProperty2}"/>
</StackPanel>
您可以使用XAML视图中的样式和触发器执行此操作:
<TextBox x:Name="TxtFruit" Text="{Binding CurrentFruit}"/>
<StackPanel>
<StackPanel x:Name="stackPanelApple" Orientation="Horizontal" Margin="0,0,0,20" >
<TextBox x:Name="AppleProperty1" Margin="0,0,10,0" Text="{Binding AppleProperty1}" />
<TextBox x:Name="AppleProperty2" Margin="10,0,10,0" Text="{Binding AppleProperty2}" />
<StackPanel.Style>
<Style TargetType="StackPanel">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TxtFruit}" Value="Apple">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
<StackPanel x:Name="stackPanelOrange" Orientation="Horizontal" Margin="0,0,0,20" >
<TextBox x:Name="OrangeProperty1" Margin="0,0,10,0" Text="{Binding OrangeProperty1}" />
<TextBox x:Name="OrangeProperty2" Margin="10,0,10,0" Text="{Binding OrangeProperty2}"/>
<StackPanel.Style>
<Style TargetType="StackPanel">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TxtFruit}" Value="Orange">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
</StackPanel>
您可以使用XAML视图中的样式和触发器执行此操作:
<TextBox x:Name="TxtFruit" Text="{Binding CurrentFruit}"/>
<StackPanel>
<StackPanel x:Name="stackPanelApple" Orientation="Horizontal" Margin="0,0,0,20" >
<TextBox x:Name="AppleProperty1" Margin="0,0,10,0" Text="{Binding AppleProperty1}" />
<TextBox x:Name="AppleProperty2" Margin="10,0,10,0" Text="{Binding AppleProperty2}" />
<StackPanel.Style>
<Style TargetType="StackPanel">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TxtFruit}" Value="Apple">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
<StackPanel x:Name="stackPanelOrange" Orientation="Horizontal" Margin="0,0,0,20" >
<TextBox x:Name="OrangeProperty1" Margin="0,0,10,0" Text="{Binding OrangeProperty1}" />
<TextBox x:Name="OrangeProperty2" Margin="10,0,10,0" Text="{Binding OrangeProperty2}"/>
<StackPanel.Style>
<Style TargetType="StackPanel">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TxtFruit}" Value="Orange">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
</StackPanel>
在视图模型中不需要执行此操作。您可以使用样式中的数据触发器来解决此问题,例如:
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TxtFruit}" Value="Apple">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
在任何资源中创建转换器的实例,例如在应用程序资源字典中
<local:EqualityToVisibilityConverter x:Key="EqualityToVisibilityConverter"/>
然后,您可以轻松地重用转换器来绑定可见性,而无需样式
<TextBox x:Name="TxtFruit" Text="{Binding CurrentFruit}"/>
<StackPanel>
<StackPanel x:Name="stackPanelApple" Orientation="Horizontal" Margin="0,0,0,20"
Visibility="{Binding Text, ElementName=TxtFruit, Converter={StaticResource EqualityToVisibilityConverter}, ConverterParameter=Apple}">
<TextBox x:Name="AppleProperty1" Margin="0,0,10,0" Text="{Binding AppleProperty1}"/>
<TextBox x:Name="AppleProperty2" Margin="10,0,10,0" Text="{Binding AppleProperty2}"/>
</StackPanel>
<StackPanel x:Name="stackPanelOrange" Orientation="Horizontal" Margin="0,0,0,20"
Visibility="{Binding Text, ElementName=TxtFruit, Converter={StaticResource EqualityToVisibilityConverter}, ConverterParameter=Orange}">
<TextBox x:Name="OrangeProperty1" Margin="0,0,10,0" Text="{Binding OrangeProperty1}"/>
<TextBox x:Name="OrangeProperty1" Margin="10,0,10,0" Text="{Binding OrangeProperty2}"/>
</StackPanel>
</StackPanel>
在视图模型中不需要执行此操作。您可以使用样式中的数据触发器来解决此问题,例如:
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TxtFruit}" Value="Apple">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
在任何资源中创建转换器的实例,例如在应用程序资源字典中
<local:EqualityToVisibilityConverter x:Key="EqualityToVisibilityConverter"/>
然后,您可以轻松地重用转换器来绑定可见性,而无需样式
<TextBox x:Name="TxtFruit" Text="{Binding CurrentFruit}"/>
<StackPanel>
<StackPanel x:Name="stackPanelApple" Orientation="Horizontal" Margin="0,0,0,20"
Visibility="{Binding Text, ElementName=TxtFruit, Converter={StaticResource EqualityToVisibilityConverter}, ConverterParameter=Apple}">
<TextBox x:Name="AppleProperty1" Margin="0,0,10,0" Text="{Binding AppleProperty1}"/>
<TextBox x:Name="AppleProperty2" Margin="10,0,10,0" Text="{Binding AppleProperty2}"/>
</StackPanel>
<StackPanel x:Name="stackPanelOrange" Orientation="Horizontal" Margin="0,0,0,20"
Visibility="{Binding Text, ElementName=TxtFruit, Converter={StaticResource EqualityToVisibilityConverter}, ConverterParameter=Orange}">
<TextBox x:Name="OrangeProperty1" Margin="0,0,10,0" Text="{Binding OrangeProperty1}"/>
<TextBox x:Name="OrangeProperty1" Margin="10,0,10,0" Text="{Binding OrangeProperty2}"/>
</StackPanel>
</StackPanel>
这就像一个符咒。但我需要一个更像非xaml的解决方案。太谢谢你了,这很有魅力。但我需要一个更像非xaml的解决方案。非常感谢,太棒了!使用数据触发器
可以。但我还是坚持使用值转换器方法。我非常感谢你的帮助。太棒了!使用数据触发器
可以。但我还是坚持使用值转换器方法。我非常感谢你的帮助。