根据组合框选择使按钮可见

时间:2018-12-27 15:33:38

标签: wpf xaml

如果使用XAML在ComboBox中选择了某个值,如何显示按钮?

这是我尝试过的。

谢谢

        <ComboBox x:Name="ComboBox" Margin="171,102,426,271">
        <ComboBoxItem>Testing</ComboBoxItem>
        <ComboBoxItem>Again</ComboBoxItem>
        <ComboBoxItem>Finally</ComboBoxItem>
    </ComboBox>

    <Button Margin="10, 0, 0, 0" >
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedIndex, ElementName=ComboBox}" Value="Testing">
                        <Setter Property="Visibility" Value="Hidden"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

2 个答案:

答案 0 :(得分:1)

绑定路径应为SelectedItem.Content,触发器才能起作用:

<Button Margin="10, 0, 0, 0" >
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedItem.Content, ElementName=ComboBox}" Value="Testing">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

您当前绑定到SelectedIndex属性,并且该属性永远不会具有“测试”值。当前选择的ComboBoxItem的{​​{1}}属性可能有。

如果要在选择“测试”选项时显示Content,还应该修改设置器的值:

Button

答案 1 :(得分:1)

更好的方法是将控件绑定到视图模型并在其中集成逻辑。参见:Explain Combo Box Binding In MVVM - WPF

作为示例,我们创建一个用于编辑人员数据的窗口。它包含一个组合框,用户可以在其中选择城市。选择某个城市后,将显示一个按钮,否则将被隐藏。

您可以拥有一个如下所示的视图模型

public class PersonViewModel: INotifyPropertyChanged
{
    private string _city;
    public string City
    {
        get { return _city; }
        set {
            if (value != _city) {
                _city = value;
                OnPropertyChanged(nameof(City));
                OnPropertyChanged(nameof(MyButtonVisibility));
            }
        }
    }

    public List<string> Cities { get; } = new List<string> { "Austin", "Boston", "Chicago"};

    public Visibility MyButtonVisibility => City == "Boston"
        ? Visibility.Visible
        : Visibility.Hidden;

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    // Other properties

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set {
            if (value != _firstName) {
                _firstName = value;
                OnPropertyChanged(nameof(FirstName));
            }
        }
    }

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set {
            if (value != _lastName) {
                _lastName = value;
                OnPropertyChanged(nameof(LastName));
            }
        }
    }
}

请注意,它实现了INotifyPropertyChanged。它有一个Cities集合(用于显示组合框项目)和一个City属性(用于所选城市)。

我们还需要一个按钮可见性的属性(MyButtonVisibility)。请注意,当所选城市发生变化时,我们还会为PropertyChanged引发MyButtonVisibility事件,以通知WPF重新查询按钮的可见性。

在窗口的构造函数中,我们分配视图模型:

public MainWindow()
{
    InitializeComponent();
    DataContext = new PersonViewModel();
}

组合框的XAML代码是

<ComboBox x:Name="citiesComboBox" HorizontalAlignment="Left" Margin="116,96,0,0"
    VerticalAlignment="Top" Width="120"
    ItemsSource="{Binding Path=Cities}"    
    SelectedItem="{Binding Path=City}"  
/>

该按钮的XAML代码为

<Button Content="Button" HorizontalAlignment="Left" Margin="116,164,0,0"
    VerticalAlignment="Top" Width="75"
    Visibility="{Binding MyButtonVisibility}"
/>

借助WPF绑定的魔力,当您选择城市时,该按钮会自动出现或消失。