Как вы обрабатываете отношения внешнего ключа Linq to SQL в WPF DataBinding - PullRequest
1 голос
/ 12 января 2010

Я боролся с этой проблемой в течение некоторого времени, поэтому сегодня я начал новый проект и упростил основы до основ. То, что я хочу сделать, это иметь список, связанный с коллекцией с подробным представлением выбранного элемента, показанным ниже. Все работает нормально, за исключением того, что элементы, ссылающиеся на другие таблицы, просто показывают внешний ключ. Я смог решить эту проблему с помощью запроса linq, но понял, что метод, который я использовал, является хакерским.

public partial class Window1 : Window
{
    DataClasses1DataContext db = new DataClasses1DataContext();
    public IEnumerable<Issue> issues = null;

    public Window1()
    {
        InitializeComponent();
        issues = from i in db.Issues
                 select i;
        this.DataContext = issues;
    }

    // The hacked in query that correctly displays the name instead of Key
    private void IssueListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        List<Issue> _issues = issues.ToList();
        int empl = _issues[IssueListBox.SelectedIndex].IssOwner;

        OwnerTextBlock.Text = (from emp in db.Employees
                              where emp.EmpID == empl
                              select emp.EmpFirstName.ToString() + " " + 
                                       emp.EmpLastName.ToString()).Single();            
    }
}

Xaml так просто, как я мог его получить:

<Window.Resources>
    <DataTemplate x:Key="ShowIssueDetail">
        <TextBlock Text="{Binding Path=IssTitle}" FontWeight="Bold" FontSize="14"/>
    </DataTemplate>
</Window.Resources>

    <StackPanel>
    <TextBlock Text="Issues" FontWeight="Bold" />
    <ListBox x:Name="IssueListBox"
              ItemsSource="{Binding}"
              ItemTemplate="{StaticResource ShowIssueDetail}"
              IsSynchronizedWithCurrentItem="True"
              HorizontalContentAlignment="Stretch" SelectionChanged="IssueListBox_SelectionChanged">
    </ListBox>

    <TextBlock Text="{Binding Path=IssDescription}" />
    <TextBlock Text="{Binding Path=IssOwner}" /> <!--I want this to show the name, not the Key-->
    <TextBlock Name='OwnerTextBlock' /> <!--This has the name set in code from the Linq query and works-->
</StackPanel>

Как мне сделать это правильно?

1 Ответ

1 голос
/ 12 января 2010

Linq2Sql ORM автоматически генерирует свойства, которые представляют связанные записи на основе отношений в модели. В вашем случае я бы предположил, что если вы измените привязку OwnerTextBlock на следующее - вы получите то, что хотите:

<TextBlock Name="OwnerTextBlock" Text="{Binding Employee.FirstName}" /> 

(я связал только FirstName, потому что для объединения имен и фамилий с использованием XAML требуется реализация MultiBinding и IMultiValueConverter - что выходит за рамки этого ответа :))

Помните, что должно быть отношение ORM между связанными объектами, чтобы это работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...