Привязать текстовое поле к Func<T> (запрос Linq)

Я работаю над сайд-проектом, где я ударился о стену после долгих прогулок и мог бы помочь.

Вот ситуация: у меня есть окно, которое я хочу динамически заполнить на основе выбора в выпадающем списке (легкий), поэтому я все строю программно. Мне нужно создать несколько блоков, которые будут заполняться на основе разных запросов в одном наборе результатов. Я планировал установить для Binding.Source (свойства textbox) значение Func, чтобы при вызове источника обновления он автоматически запускал эту функцию.

Этого не происходит. Есть мысли о том, как связать текстовое свойство с запросом LINQ, который со временем изменится?

Я могу предоставить любую дополнительную информацию, которая требуется.

Спасибо ник

Обновить сниппеты:

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

Установка функции в качестве источника привязки (имя параметра - bindingSource)

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

2 ответа

Решение

Что-то должно делать "волшебство". В вашем случае это будет конвертер, который преобразует лямбда-выражение в строку.

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

Вы реализуете INotifyPropertyChanged?

Как насчет этого простого подхода для вашей модели представления / контекста данных:

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));
    }
}
Другие вопросы по тегам