如果使用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>
答案 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绑定的魔力,当您选择城市时,该按钮会自动出现或消失。