C# WPF数据绑定:基于var的内容启用/禁用控件?
我的表单上有一个按钮,只有在treeview(或tabitem中的listview)中选择某个项目时才应启用该按钮。选择项时,其值存储在字符串成员变量中 我可以将按钮的C# WPF数据绑定:基于var的内容启用/禁用控件?,c#,wpf,data-binding,C#,Wpf,Data Binding,我的表单上有一个按钮,只有在treeview(或tabitem中的listview)中选择某个项目时才应启用该按钮。选择项时,其值存储在字符串成员变量中 我可以将按钮的IsEnabled属性绑定到成员变量的内容吗?也就是说,如果成员变量不是空的,则启用该按钮 类似地,当成员变量的内容更改(设置或清除)时,按钮的状态应该更改。由于您可能希望基于字符串绑定按钮的IsEnabled属性,请尝试为其制作转换器 即。。。 编辑: 由于OP希望绑定到变量,因此需要执行以下操作: public class
IsEnabled
属性绑定到成员变量的内容吗?也就是说,如果成员变量不是空的,则启用该按钮
类似地,当成员变量的内容更改(设置或清除)时,按钮的状态应该更改。由于您可能希望基于字符串绑定按钮的IsEnabled属性,请尝试为其制作转换器 即。。。 编辑: 由于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}}
{Binding Path=SomeString,Converter={StaticResource mystringtoboolconverter}
注意,必须实现INotifyPropertyChanged才能更新UI。是否有保存字符串属性的ViewModel设置为尝试执行此绑定的视图的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>
点击我!
这并没有完全回答这个问题,是的,这是一个十年前的问题,但是。。。我遇到了这个非常有用的把戏,这是我的荣幸
现在,按钮的启用取决于名为“txtName”的元素的填充度。感谢您的回复。我的xaml中有一个错误,在这行:“没有找到类型local:StringToBoolConverter。”StringToBoolConverter是我的转换器类的名称。我需要用名称空间来限定它吗?明白了。xaml.Hmm中的命名空间问题。我认为这是不完整的;看起来按钮响应的成员属性需要引发某种事件,因此当成员属性更改时,按钮的启用状态将更改。基本上,是的。当SelectedItem更改时,按钮的值也会更改。如果您想基于其他内容对其进行更改,请将其绑定到该内容。最重要的部分是将字符串绑定到按钮并使用转换器使其成为bool。然后必须向var添加OnPropertyChanged。我现在已经将它绑定到列表中的选择更改。如果你想要的是,var something=somethingnew;要在UI中反映这一点,您必须将该变量设置为属性并实现INotifyPropertyChanged。。。我将把它添加到我的帖子中。string属性在我的主窗口类中。有没有办法让它在这种情况下工作?现在,没有调用HasContent()方法;我怀疑这与未设置DataContext有关。是什么导致按钮调用HasContent()来设置其状态?此外,我没有获取字符串值的控件。IsEnabled是否需要UpdateSourceTrigger属性?如果窗口具有这些属性,则可以在Windows Loaded事件中将其设置为自己的DataContext,如:this.DataContext=this。然而,这是非常糟糕的做法。您应该考虑将VIEW模型与我的示例集中的视图模型一样作为DATACONTEXT。注意HasContent不是一个方法,它是一个属性,因为只有属性才能绑定到视图。每次使用特定属性名称引发PropertyChanged时,都会计算其getter。UpdateSourceTrigger主要用于文本框使用每个键入的键将其文本更改写回绑定属性。否则他们会在失去焦点的情况下这样做
this.DataContext = new MyClass();
<StackPanel>
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
<Button IsEnabled="{Binding HasContent}">
Click Me!
</Button>
</StackPanel>
<Button Content="Add Name " Width="100" Height="30"
IsEnabled="{Binding ElementName=txtName, Path=Text.Length, Mode=OneWay}">
</Button>