Сделать кнопку видимой на основе выбора ComboBox - PullRequest
0 голосов
/ 27 декабря 2018

Как сделать так, чтобы кнопка отображалась, если в ComboBox выбрано определенное значение с использованием XAML?

Это то, что я пробовал.

Спасибо

        <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 голосов
/ 27 декабря 2018

Лучший подход - привязать элементы управления к модели представления и интегрировать там логику.См .: Объяснение привязки поля со списком в 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 теперь кнопка появляется или исчезает автоматически, когда вы выбираете города.

0 голосов
/ 27 декабря 2018

Путь привязки должен быть 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 была выбрана 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...