2015-08-11 2 views
4

Je travaille sur un projet parallèle où j'ai frappé un mur après avoir beaucoup piqué et pourrait utiliser de l'aide.Lier la boîte de texte à Func <T> (requête Linq)

Voici la situation: J'ai une fenêtre que je veux remplir dynamiquement en fonction d'un choix dans une liste déroulante (facile) donc je construis tout par programmation. Ce que j'ai besoin de construire est plusieurs boîtes qui vont peupler basé sur des requêtes différentes dans le même ensemble de résultats. Ce que j'avais l'intention de faire était de définir le Binding.Source (de la propriété de texte de la zone de texte) à un Func et que lorsque la source de mise à jour a été appelée, il exécuterait automatiquement cette fonction.

Cela n'arrive pas. Des réflexions sur la façon de lier une propriété de texte à une requête LINQ qui va changer au fil du temps?

Je peux vous fournir plus d'informations.

Merci, Nick

Mise à jour Snippets:

private int AllelePopulation(IAllele allele) 
    { 
     var list= from b in _population.Populus 
      from g in b.Genes 
      where g.Representation == allele.Representation 
      select b; 
     return list.ToList().Count; 
    } 

Réglage de la fonc comme source de liaison (nom du paramètre est BindingSource)

var binding = new Binding 
    { 
     Source = bindingSource, 
     Mode = BindingMode.OneWay 
    }; 
    tb.SetBinding(TextBox.TextProperty, binding); 
+0

fournissent extrait peut donner une bonne réponse de ce site –

+0

Juste un petit indice offtopic. Remplacez 'list.ToList(). Count' par' list.Count() '. Devrait être plus rapide et est également facile à lire. – Onur

Répondre

3

Quelque chose doit faire la "magie" . Dans votre cas, ce serait un convertisseur qui convertit une expression lambda en une chaîne.

class Conv : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((Func<string>)value)(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var binding = new Binding 
     { 
      Source = (Func<string>)AllelePopulation, 
      Mode = BindingMode.OneWay, 
      Converter = new Conv() 
     }; 
     textBox.SetBinding(TextBox.TextProperty, binding); 
    } 

    private string AllelePopulation() 
    { 
     return "test"; 
    } 
} 
+0

Maxim: Cela a fonctionné comme un charme. Je vais devoir continuer à travailler dessus, mais pointer vers les convertisseurs était parfait. J'apprécie vraiment que vous preniez le temps sur ce forum pour aider. – Nick

0

Implémentez-vous INotifyPropertyChanged?

Comment cette approche simple pour votre viewmodel/contexte de données:

public class DC : INotifyPropertyChanged 
{ 

    // access to you Func<string> is simply via a property 
    // this can be used by setting the binding in code or in XAML 
    public string Allele 
    { 
     get { return MyFunc(); } 
    } 


    // whenever a variable used in your function changes, raise the property changed event 
    private int I 
    { 
     get { return i; } 
     set { i = value; OnPropertyChanged("Allele"); } 
    } 
    private int i; 

    public void Modify() 
    { 
     // by using the property, the change notification is done implicitely 
     I = I + 1; 
    } 

    // this is your private int AllelePopulation(IAllele allele) function 

    private string MyFunc() 
    { 
     return (I*2).ToString(); 
    } 




    // property changed notification 
    public event PropertyChangedEventHandler PropertyChanged; 
    [NotifyPropertyChangedInvocator] 
    private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

J'ai deux excellentes solutions à envisager, et je pense que l'une ou l'autre pourrait résoudre ce problème. Ce soir, quand j'en aurai l'occasion, j'y jetterai un coup d'œil. Merci de votre aide! – Nick

+0

Onur, merci pour votre réponse. C'est aussi un bon moyen de résoudre ce problème, mais en raison d'autres exigences que j'ai ce ne serait pas le gérer pour moi. J'apprécie votre temps! – Nick