C# WPF数据绑定:基于var的内容启用/禁用控件?

C# WPF数据绑定:基于var的内容启用/禁用控件?,c#,wpf,data-binding,C#,Wpf,Data Binding,我的表单上有一个按钮,只有在treeview(或tabitem中的listview)中选择某个项目时才应启用该按钮。选择项时,其值存储在字符串成员变量中 我可以将按钮的IsEnabled属性绑定到成员变量的内容吗?也就是说,如果成员变量不是空的,则启用该按钮 类似地,当成员变量的内容更改(设置或清除)时,按钮的状态应该更改。由于您可能希望基于字符串绑定按钮的IsEnabled属性,请尝试为其制作转换器 即。。。 编辑: 由于OP希望绑定到变量,因此需要执行以下操作: public class

我的表单上有一个按钮,只有在treeview(或tabitem中的listview)中选择某个项目时才应启用该按钮。选择项时,其值存储在字符串成员变量中

我可以将按钮的
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>