IValueConverter和非常量值

时间:2014-07-15 21:27:27

标签: c# .net wpf ivalueconverter

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

1 个答案:

答案 0 :(得分:3)

看起来您正在使用Entity Framework,因此简单解决方案是让(可能是现有的)导航属性完成其工作:

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

这假设文本&#34;教师&#34;在&#34;名称&#34; &#34;描述&#34;中的列表。您提到需要编辑它,在处理数据库本身时会变得非常复杂(创建新记录等)。正确设置ComboBox控件可以为您执行此操作(绑定SelectedValue而不是Text)。

如果您拥有EF,或由于某种原因无法使用导航属性,请执行以下操作:

  1. 让您的转换器来自DependencyObject
  2. 创建DependencyProperty,其中包含Description个对象(称之为ItemsSource
  3. 绑定到视图模型中的Descriptions集合(假设窗口的名称设置为&#34; root&#34;):

    <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);
       }
    }
    
  5. 转换回来有点类似于编辑目的。

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