【问题标题】:Make Button Visible Based on ComboBox selection根据 ComboBox 选择使按钮可见
【发布时间】:2018-12-28 00:57:30
【问题描述】:

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

这是我尝试过的。

谢谢

        <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>

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

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

    作为示例,我们创建一个用于编辑人员数据的窗口。它包含一个组合框,用户可以在其中选择一个城市。 When a certain city is selected, a button is is displayed, otherwise it is hidden.

    你可以有一个看起来像这样的视图模型

    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)。请注意,当所选城市发生变化时,我们还会为 MyButtonVisibility 引发 PropertyChanged 事件,以告诉 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 绑定的魔力,现在当您选择城市时,按钮会自动出现或消失。

    【讨论】:

    • 有趣!我不明白为什么我们需要在后面的代码中使用名字和姓氏?这是额外的吗?
    • 这不是隐藏代码。它不在窗口代码中,它是一个名为 View Model 的单独类,即表单的数据源。名字和姓氏将绑定到文本框。唯一需要的代码是DataContext = new PersonViewModel(); 或从某个地方获取人员数据的等效代码。其他一切都是通过绑定完成的,而不是代码。即使在代码中也不再需要加载组合框项目。谷歌MVVM
    【解决方案2】:

    绑定路径应该是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 属性,而该属性从未具有“Testing”值。当前选中的ComboBoxItemContent 属性可能有。

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

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

    【讨论】:

    • 太好了,似乎有效。它似乎在做相反的事情,隐藏在错误的选项上。我尝试过最初隐藏按钮,然后将值设置为可见但不显示。这与 相反
    • 应该这样做,但它仍然隐藏
    • @IamAJoker:你不能这样设置 Button 的 Visibility 属性。您应该在样式中设置默认值。同样,请在我的答案中查看第二个代码 sn-p。
    • @mn8 是的,我最初正忙于尝试粘贴代码,而您正在回复,所以没有看到它被编辑。我不知道设置答案是否正确,然后创建了一个不同的问题。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多