Привязать текстовое поле к 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));
}
}