XAML 如何触发触发器

siotufzp  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(237)

我的问题涉及到如何根据用户鼠标输入启动操作。
我有一个wpf窗口,它显示一个组织的信息。有些组织是供应商,在这种情况下,供应商信息显示在网格的另一行。我使用下面的触发器来显示/隐藏该行。这可以按需要工作。

<RowDefinition>
   <RowDefinition.Style>
      <Style
         TargetType="RowDefinition">
         <Setter Property="Height" Value="0" />
         <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsVendor}" Value="True">
               <Setter Property="Height" Value="*" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </RowDefinition.Style>
</RowDefinition>

对于不是供应商的组织,用户可以单击按钮来添加供应商信息并将新信息链接到组织。但是,该操作不会触发触发器。是否有方法可以做到这一点?或者是否有其他方法可以更好地工作?

brgchamk

brgchamk1#

在您的示例中,我将使用转换器并绑定Height属性的值。

<RowDefinition>
   <RowDefinition.Style>
      <Style TargetType="RowDefinition">
         <Setter Property="Height" Value="{Binding IsVendor, Converter={StaticResource IsVendorConverter}}" />
      </Style>
   </RowDefinition.Style>
</RowDefinition>

转换器将接收布尔值(IsVendor),如果IsVendor为false,则返回“0”;如果IsVendor为true,则返回“*”。

public class IsVendorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var isVendor = (bool)value;
            if (isVendor)
            {
                return "*";
            }
            return "0";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

你没有分享你的xaml,但是这里有一个按钮的例子(点击一个按钮会改变另一个按钮的高度)。

<Window
    x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <Window.Resources>
        <local:IsVendorConverter x:Key="IsVendorConverter" />
    </Window.Resources>
    <StackPanel Orientation="Horizontal">
        <Button Width="200" Height="{Binding IsVendor, Converter={StaticResource IsVendorConverter}}" />
        <Button Width="200" Height="100" Click="Button_Click"/>
    </StackPanel>
</Window>

代码隐藏:

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }
        private bool _isVendor = false;
        public bool IsVendor { 
            get { return _isVendor; } 
            set { _isVendor = value; OnPropertyRaised("IsVendor"); } 
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyRaised(string propertyname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IsVendor = true;
        }
    }

相关问题