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

IValueConverter和非常量值

看起来您正在使用实体框架,因此简单的解决方案是让(假定存在的)导航属性完成它的工作:

<TextBlock Text="{Binding Description.Name}"/>

假设文本"Teacher"位于"Description"表的"Name"列中。您提到需要编辑它,这在处理数据库本身(创建新记录等)时可能会变得非常复杂。正确设置的ComboBox控件可以为您做到这一点(绑定SelectedValue而不是Text)。

如果没有属性,或者由于某些原因不能使用导航属性,请执行以下操作:

  1. 让您的转换器派生自DependencyObject
  2. 创建DependencyProperty,它是Description对象的集合(称为ItemsSource)
  3. 绑定到视图模型中的描述集合(假设窗口的名称设置为"root"):

    <local:MyConverter ItemsSource="{Binding Source={x:Reference Name=root}, Path=DataContext.Descriptions}"/>
    
  4. 使用集合:

    public object Convert(object value, ...)
    {
       if (value is Person)
       {
           Person dude = (Person)value;
           return ItemsSource.FirstOrDefault(d => d.Id == dude.DescriptionId);
       }
    }
    

对于编辑目的,Convert back有点类似。

如果可以的话,一定要选择第一个选项,但知道第二个选项真的很有用!