C # WPF XAML привязка к DataTable - PullRequest
4 голосов
/ 08 апреля 2010

У меня есть следующие таблицы:

Company {CompanyID, CompanyName}
Сделка {CompanyID, Value}

И у меня есть список:

<ListBox Name="Deals"
         Height="100" Width="420" Margin="0,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"
         Visibility="Visible" IsSynchronizedWithCurrentItem="True"
         ItemsSource="{Binding}" SelectionChanged="Deals_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding companyRowByBuyFromCompanyFK.CompanyName}" FontWeight="Bold"  />
                <TextBlock Text=" -> TGS -> " />
                <TextBlock Text="{Binding BuyFrom}" FontWeight="Bold" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Как видите, я хочу отобразить CompanyName, а не ID, который является внешним ключом.Отношение «companyRowByBuyFromCompanyFK» существует, так как в Deals_SelectionChanged я могу получить доступ к свойству companyRowByBuyFromCompanyFK строки Deals, а также могу получить доступ к свойству CompanyName этой строки.

Является ли причиной того, что это не работает, потому что XAML использует привязкуиндексатор?Вместо свойств в CompanyRows в моей DataTable?

В данный момент я получаю такие значения, как

  • -> TGS -> 3
  • -> TGS ->4

Редактировать Обновление ошибки привязки

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: свойство 'companyRowByBuyFromCompanyFK' не найдено в 'объект '' 'DataRowView' (HashCode = 30295189) '.BindingExpression: Path = companyRowByBuyFromCompanyFK.CompanyName;DataItem = 'DataRowView' (HashCode = 30295189);целевым элементом является TextBlock (Name = '');Свойство target имеет значение «Text» (тип «String»)

Похоже, что оно не преобразует элемент DataRowView в SuppliersRow

Какой наилучший способ выполнить это?

  1. Создать конвертер для преобразования внешних ключей, используя таблицу, на которую ссылаются как на пользовательский параметр.

  2. Создать представление таблицы для каждой таблицы?Это было бы долго, потому что у меня довольно много таблиц с внешними ключами.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2010

Кто-то убил меня .... спасибо, что указал на окно вывода, я всегда об этом забываю!: (

Я нашел решение, посмотрев в окно вывода, которое было следующим:

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: свойство 'companyRowByBuyFromCompanyFK' не найденоon 'object' '' DataRowView

Я выяснил, что привязка DataTemplate была привязана к SelectedItem объекта DataTemplate, который является DataRowView, а не к фактическим строго типизированным данным. К счастью, класс DataRowView имеет строкусвойство, указывающее на класс DataRow (который является supplierRow), поэтому я мог связываться оттуда как обычно. Fix был в следующей строке.

<TextBlock Text="{Binding companyRowByBuyFromCompanyFK.CompanyName}" FontWeight="Bold"  />

Изменение этого значения на следующее сработало, как я и ожидал.

<TextBlock Text="{Binding Row.companyRowByBuyFromCompanyFK.CompanyName}" FontWeight="Bold"  />
1 голос
/ 13 апреля 2010

Как насчет установки мультисвязывания в табличке данных, которая преобразует строку (источник данных из списка), вместе с иерархической привязкой (которая передает ссылку на другую таблицу из родительского элемента управления) и именем поля в другая таблица для поиска идентификатора внутри?

<UserControl x:Class="local:MyUserControl">
    <ListBox ItemsSource="{Binding Items}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label>
                    <Label.Content>
                        <MultiBinding Converter="{StaticResource myConverter}">
                            <Binding Path="OtherId" />
                            <Binding
                                RelativeSource="RelativeSource FindAncestor,
                                    AncestorType={x:Type local:MyUserControl}}}"
                                Path="OtherTable" />
                        </MultiBinding>
                    </Label.Content>
                </Label>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</UserControl>

В конвертере:

public object Convert(object[] values, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)
{
    // TODO: Input type checks

    // TODO: Castings, find key in other table, return relevant field
    return (values[1] as IDictionary<String, String>)[values[0] as String];
}
...