我在我的表单上有一个按钮,只有在树形视图(或选项卡中的列表视图)中选择项目时,该按钮才应启用。当选择一个项目时,其值将存储在字符串成员变量中。
我可以将按钮的 IsEnabled
属性绑定到成员变量的内容吗?也就是说,如果成员变量不为空,则启用该按钮。
类似地,当成员变量的内容更改(设置或清除)时,按钮的状态应更改。
我在我的表单上有一个按钮,只有在树形视图(或选项卡中的列表视图)中选择项目时,该按钮才应启用。当选择一个项目时,其值将存储在字符串成员变量中。
我可以将按钮的 IsEnabled
属性绑定到成员变量的内容吗?也就是说,如果成员变量不为空,则启用该按钮。
类似地,当成员变量的内容更改(设置或清除)时,按钮的状态应更改。
由于您可能希望根据一个字符串绑定按钮的IsEnabled属性,因此请尝试为其制作一个转换器。
也就是说...
<StackPanel>
<StackPanel.Resources>
<local:SomeStringConverter mystringtoboolconverter />
</StackPanel.Resources>
<Button IsEnabled="{Binding ElementName=mytree, Path=SelectedItem.Header, Converter={StaticResource mystringtoboolconverter}}" />
<StackPanel>
并且这是一个转换器:
[ValueConversion(typeof(string), typeof(bool))]
class SomeStringConverter : IValueConverter {
public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
string myheader = (string)value;
if(myhead == "something"){
return true;
} else {
return false;
}
}
public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) {
return null;
}
}
编辑: 由于 OP 想要绑定到一个变量,需要做类似这样的事情:
public class SomeClass : INotifyPropertyChanged {
private string _somestring;
public string SomeString{
get{return _somestring;}
set{ _somestring = value; OnPropertyChanged("SomeString");}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然后,将上面的绑定表达式更改为:
{Binding Path=SomeString, Converter={StaticResource mystringtoboolconverter}}
请注意,您必须实现INotifyPropertyChanged
接口才能更新UI。
您是否有一个 ViewModel,将其字符串属性设置为 View 的 DataContext,并在其中尝试进行此绑定?
那么以下内容将起作用:
// Example ViewModel
public class MyClass : INotifyPropertyChanged
{
private string text;
public string Text
{
get { return text; }
set
{
text = value;
UpdateProperty("Text");
UpdateProperty("HasContent");
}
}
public bool HasContent
{
get { return !string.IsNullOrEmpty(text); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void UpdateProperty(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
this.DataContext = new MyClass();
以下是一个 Xaml 示例:
<StackPanel>
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
<Button IsEnabled="{Binding HasContent}">
Click Me!
</Button>
</StackPanel>
这并不是完全回答问题的方式,而且这个问题已经十年了,但是...我发现了这个非常有用的技巧,感谢https://www.codeproject.com/Tips/215457/How-to-make-Button-Enable-Disable-depends-on-a-Tex。
<Button Content="Add Name " Width="100" Height="30"
IsEnabled="{Binding ElementName=txtName, Path=Text.Length, Mode=OneWay}">
</Button>
现在按钮的启用取决于名为“txtName”的元素的填充情况。