2014-07-15 2 views
0

с использованием C#, WPFIValueConverter и не постоянное значение

Я пытаюсь создать IValueConverter для преобразования идентификатора из базы данных в другое значение из другой таблицы в той же базе данных. Пример: У меня есть один человек с идентификатором «1», а в другой таблице ИМЯ «Джеймс» для этого идентификатора. Я хочу - привязать идентификатор к определенному элементу управления и конвертировать идентификатор в NAME.

Во время создания такого конвертера у меня возникла проблема - я не могу создать конвертер для нестатического значения. Мой Вопрос - Можно ли создать IValueConverter с нестатистическим значением?

EDIT:

Это то, что было сделано:

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

Таким образом, вы имеете в виду, что вам нужен связующий конвертер (или что-то подобное)? – BradleyDotNET

+0

Если вы не слышали о 'bindable ConverterParameter' – gbk

+3

Это субъективно, но я думаю, что конвертер значений - это неправильное место, чтобы делать такие вещи, как открытие соединений с базой данных. Было бы более подходящим свойство вашей модели (или viewmodel?). – Jon

ответ

3

Похоже, что вы используете Entity Framework, поэтому простой решение позволить (предположительно существующие) Навигационная свойство делать его работа:

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

Предполагается, что текст «Учитель» находится в столбце «Имя» в таблице «Описание». Вы упомянули, что нужно его отредактировать, что может стать очень сложным при работе с самой базой данных (создание новых записей и т. Д.). Правильно настроенный элемент управления ComboBox может сделать это за вас (привяжите SelectedValue вместо Text).

Если вы DonT имеет EF, или не можете использовать навигационные свойства какой-либо причина, выполните следующие действия:

  1. Есть ваш конвертер проистекает из DependencyObject
  2. Создать DependencyProperty, что представляет собой набор Description объектов (назовите его ItemsSource)
  3. Вложение в коллекцию описаний в вашей модели просмотра (это предполагает, что окно имеет свое имя «корень»):

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

Преобразовать обратно несколько похожа для редактирования.

Определенно пойдите с первым вариантом, если сможете, но знание второго может быть действительно полезным!

+0

Да, я использую EntityFramework, и я вообще забыл о свойствах навигации - попробуйте, как вам грустно - в моем случае 'Binding =" {Binding TeacherSet.Name} "' - result - I получил именно то, что мне нужно. Спасибо за объяснение и помощь – gbk

Смежные вопросы