IValueConverter和非常量值
本文关键字:常量 非常 IValueConverter | 更新日期: 2023-09-27 18:13:16
using c#, WPF
我尝试创建IValueConverter
,用于将ID从数据库转换为同一数据库中另一个表的另一个值。示例:我有一个ID为"1"的人,这个ID在另一个名为"James"的表中。我想要的-将ID绑定到一些控件,并将ID转换为NAME。
在创建这样的转换器时,我遇到了一些问题-我无法创建非静态值的转换器。我的问题 -是否有可能创建具有非静态值的IValueConverter
?
结果如下:
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
using (var dbContext = new EducationDataBaseEntities())
{
//list for all existing id
List<int> id = null;
//add existing id to list
foreach (var item in dbContext.GradeSet)
{
id.Add(item.GradeId);
}
//check each item and return equialent from db
foreach (int item in id)
{
switch (Int32.Parse((string)parameter))
{
case item:
{
foreach (var items in dbContext.GradeSet)
{
if (item == items.GradeId)
{
return items.Equialent;
}
}
}
}
}
return Binding.DoNothing;
}
}
看起来您正在使用实体框架,因此简单的解决方案是让(假定存在的)导航属性完成它的工作:
<TextBlock Text="{Binding Description.Name}"/>
假设文本"Teacher"位于"Description"表的"Name"列中。您提到需要编辑它,这在处理数据库本身(创建新记录等)时可能会变得非常复杂。正确设置的ComboBox
控件可以为您做到这一点(绑定SelectedValue
而不是Text
)。
如果没有属性,或者由于某些原因不能使用导航属性,请执行以下操作:
- 让您的转换器派生自
DependencyObject
- 创建
DependencyProperty
,它是Description
对象的集合(称为ItemsSource
) 绑定到视图模型中的描述集合(假设窗口的名称设置为"root"):
<local:MyConverter ItemsSource="{Binding Source={x:Reference Name=root}, Path=DataContext.Descriptions}"/>
使用集合:
public object Convert(object value, ...) { if (value is Person) { Person dude = (Person)value; return ItemsSource.FirstOrDefault(d => d.Id == dude.DescriptionId); } }
对于编辑目的,Convert back有点类似。
如果可以的话,一定要选择第一个选项,但知道第二个选项真的很有用!