使用c#,WPF
我尝试创建IValueConverter
以将ID从dataBase转换为同一dataBase中另一个表的另一个值。
示例:我有一个ID为ID" 1"在另一张桌子上,NAME" James"这个ID。我想要的 - 将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;
}
}
答案 0 :(得分:3)
看起来您正在使用Entity Framework,因此简单解决方案是让(可能是现有的)导航属性完成其工作:
<TextBlock Text="{Binding Description.Name}"/>
这假设文本&#34;教师&#34;在&#34;名称&#34; &#34;描述&#34;中的列表。您提到需要编辑它,在处理数据库本身时会变得非常复杂(创建新记录等)。正确设置ComboBox
控件可以为您执行此操作(绑定SelectedValue
而不是Text
)。
如果您不拥有EF,或由于某种原因无法使用导航属性,请执行以下操作:
DependencyObject
DependencyProperty
,其中包含Description
个对象(称之为ItemsSource
)绑定到视图模型中的Descriptions集合(假设窗口的名称设置为&#34; root&#34;):
<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);
}
}
转换回来有点类似于编辑目的。
如果可以的话,绝对选择第一个选项,但知道第二个选项真的很有用!