2010-02-17 91 views
0

这样做:WPF:绑定到自定义类“无法绑定找到源”

public class myClass : INotifyPropertyChanged 
{ 
    public bool? myFlag = false; 
    public bool? MyFlag 
    { 
     get { return myFlag; } 
     set 
     { 
      myFlag = value; 
      OnPropertyChanged("MyFlag"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

宣布在窗口1类测试变量MyClass的:

public partial class Window1 : Window 
{ 
    myClass test; 

    public Window1() 
    { 
     InitializeComponent(); 
     test = new myClass(); 
    } 
} 

下面是一个例子XAML文件:

<Window x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" IsEnabled="{Binding ElementName=test, Path=MyFlag}"> 
    <Grid> 
     <Button>You shouldn't be clicking me</Button> 
    </Grid> 
</Window> 

该窗口未禁用,调试器向我显示该消息。

我错过了什么?

+0

这不是从你的问题不清楚,什么是'test'?如果可能,请发布所有的xaml。 – Rory 2010-02-17 05:59:08

+0

编辑它以使其更易于理解。 – zxcvbnm 2010-02-17 06:09:51

回答

2

BindingElementName属性旨在定位xaml中的其他元素,而不是对象的属性/字段。做你要完成的任务的常用方法是向myClass实例分配给窗口的DataContext属性:

public partial class Window1 : Window 
{ 
    //myClass test; 

    public Window1() 
    { 
     InitializeComponent(); 
     this.DataContext = new myClass(); //test = new myClass(); 
    } 
} 

然后你的绑定将是这样的:IsEnabled="{Binding Path=MyFlag}"

如果你真的想绑定到窗口本身的属性,你可以使用绑定这样的: IsEnabled="{Binding RelativeSource={RelativeSource Self}, Path=test.MyFlag}"

+0

有没有办法使用XAML来做到这一点?另外,如果我想在代码中稍后访问该MyFlag以更改它,该怎么办? – zxcvbnm 2010-02-17 06:37:15

+0

最后一段的挑剔:如果他走这条路线,他还需要将测试转换为属性而不是字段,因为WPF数据绑定只考虑属性。但是你的第一个建议肯定是更好的建议,如果他接受你的建议,那么后面的问题就不会出现。 – itowlson 2010-02-17 06:37:33

+1

@itowlson:好点,我实际上已经忘记了这一点。我只想给他一个办法去做他在这个问题上所做的尝试。 @zxcvbnm:该死的,这是一个难以输入的名字。如果您想从xaml设置DataContext,您可以使用附加行为(http://www.google.com/search?q=attached+behavior)来执行此操作。通常它使用MVVM模式完成(很多可用于模式的框架都有一些方法可以帮助你,例如http://wpfonyx.codeplex.com/)。 – Rory 2010-02-17 06:46:17