我有一个按钮,它是:
<Button Style="{StaticResource ButtonStylePermit1}"
Click="permit1_Click" x:Name="permit1" IsEnabled="False"/>
在我的.cs代码中,我还有一个int floor = 1;
如果floor = 2,我希望能够启用该按钮,否则,请禁用该按钮。最好的方法是什么?
答案 0 :(得分:0)
在您的.cs代码中,创建一个禁用或启用按钮的方法,然后在下限更改值时调用该方法。因此,一种简单的实现方法是在楼层成员上创建一个公共属性,并使用该属性更改楼层的值以及更改按钮的启用属性。
private int floor;
public int Floor{
get { return this.floor;}
set {
this.floor = value;
if (this.floor == 2)
{ this.permit1.Enabled = false }
else {this.permit1.Enabled = true}
}
}
this.Floor = 1;
答案 1 :(得分:0)
提供了两种解决方案,如下所示:
直截了当的想法:
如果(floor == 2)allow1.IsEnabled = true;
否则allow1.IsEnabled = false;
三元组
permit1.IsEnabled =(floor == 2)? true:否;
您可以尝试以下XAML代码作为示例:
<WrapPanel>
<Button x:Name="permit1" Content="Test" Width="200" Click="permit1_Click" IsEnabled="False" Background="Red"/>
<Button x:Name="Button1" Content="Press here" Width="100" Click="Button_Click"/>
</WrapPanel>
MainWindow.xaml.cs包含以下C#代码:
int floor;
Random random01 = new Random();
public MainWindow()
{
InitializeComponent();
}
private void permit1_Click(object sender, RoutedEventArgs e)
{
//your code here
}
private void Button_Click(object sender, RoutedEventArgs e)
{
floor = (int)Math.Round(random01.NextDouble(), 0) + 1;
Button1.Content = floor;
permit1.IsEnabled = (floor==2) ? true : false;
/*
if (floor == 2)
permit1.IsEnabled = true;
else
permit1.IsEnabled = false;
*/
}
答案 2 :(得分:0)
在WPF中,处理此问题的典型方法是使用data binding with value convertor
这里是您需要进行的更改的快速浏览:
在xaml中,您将控件的IsEnabled
属性绑定到Floor
<Button Content="Click Me!" Click="button_Click"
x:Name="permit1" IsEnabled="{Binding Floor, Converter={StaticResource converter}}">
Floor
是int
,而IsEnabled
是bool
,要链接这些链接需要转换器,我已将转换器作为Windows资源放入其中,以便它可以用于多个不同的对象(在同一类中,但是您可以将其放在中央的resource.xaml文件中)。
<Window.Resources>
<local:FloorToEnableConverter x:Key="converter" />
</Window.Resources>
要使该框架能够找到您的属性Floor
,它应该在XAML的数据上下文中,我已经在构造函数后面的代码中完成了此操作
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
您需要在自己的类中定义此转换器的逻辑,这只是IValueConverter
接口的实现
public class FloorToEnableConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
throw new ArgumentException("value cannot be null");
if ((int)value == 1)
return false;
if ((int)value == 2)
return true;
// for all other values disable
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
最后,当属性更改时,您需要通知UI有关更改,因此需要由INotifyPropertyChangeInterface
我已经在我的演示课上实现了
public partial class MainWindow : Window, INotifyPropertyChanged
实际的代码是:
public event PropertyChangedEventHandler PropertyChanged;
public int floor;
public int Floor
{
get { return this.floor;}
set { this.floor = value;
// The string here should exactly match the property name
OnPropertyChanged("Floor"); }
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
即使在本示例中我已经在类背后的代码中实现了更改通知的代码,这也应该起作用,在WPF中,请尝试避免使用类背后的代码,这是win表单中必需的,但是WPF提供了替代方法机制。看一下MVVM pattern,了解一种更好的代码结构方式。