2010-02-17 6 views
0

Cette:WPF: La liaison à une classe personnalisée "Vous ne trouvez pas la source pour la liaison"

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)); 
    } 
} 

Déclaré myClass variable de test dans la classe Window1:

public partial class Window1 : Window 
{ 
    myClass test; 

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

Voici un exemple de fichier 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> 

La fenêtre n'est pas désactivée et le débogueur me montre ce message.

Qu'est-ce qui me manque?

+0

On ne sait pas de votre question, ce qui est 'test'? S'il vous plaît poster tout votre xaml si c'est possible. – Rory

+0

L'a édité pour essayer de le rendre plus facile à comprendre. – zxcvbnm

Répondre

2

La propriété ElementName du Binding est destinée à cibler d'autres éléments dans xaml, et non des propriétés/champs de l'objet. La façon courante de faire ce que vous essayez d'accomplir est d'assigner une instance de myClass-DataContext propriété de la fenêtre:

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

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

Et puis votre liant ressemblera à ceci: IsEnabled="{Binding Path=MyFlag}".

Si vous voulez vraiment de se lier à une propriété sur la fenêtre elle-même, vous pouvez utiliser une reliure comme ceci: IsEnabled="{Binding RelativeSource={RelativeSource Self}, Path=test.MyFlag}"

+0

Y at-il un moyen de le faire en utilisant XAML? Aussi, que faire si je veux accéder à ce MyFlag plus tard dans le code pour le changer? – zxcvbnm

+0

Point difficile sur votre dernier paragraphe: s'il suit cette route, il devra également convertir le test en propriété au lieu d'un champ, car la liaison de données WPF ne considère que les propriétés. Mais votre première suggestion est certainement la meilleure, et s'il prend votre avis, ce dernier problème ne se pose pas. – itowlson

+1

@itowlson: Bon point, je l'avais en fait oublié. Je voulais juste lui donner un moyen de faire ce qu'il a essayé dans la question. @zxcvbnm: Merde, c'est un nom difficile à taper. Si vous souhaitez définir DataContext à partir de xaml, vous pouvez utiliser un comportement joint (http://www.google.com/search?q=attached+behavior) pour le faire. Normalement c'est fait en utilisant le modèle MVVM (beaucoup de frameworks disponibles pour le pattern ont une méthode pour le faire, http://wpfonyx.codeplex.com/ par exemple). – Rory

Questions connexes