Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何基于文本框值绑定控件(StackPanel)的可见性?_Wpf_Xaml_Mvvm - Fatal编程技术网

Wpf 如何基于文本框值绑定控件(StackPanel)的可见性?

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

在WPF MVVM应用程序中,我有一个
TextBox
TxtFruit
和两个
StackPanel
s
stackPanelApple
stackPanelOrange

这就是应该发生的事情:

  • 如果
    txtFruit.Text
    是“Apple”,则
    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的解决方案。非常感谢,太棒了!使用
数据触发器
可以。但我还是坚持使用
值转换器
方法。我非常感谢你的帮助。太棒了!使用
数据触发器
可以。但我还是坚持使用
值转换器
方法。我非常感谢你的帮助。