Есть ли простой способ привязки к родительским строкам в WPF? - PullRequest
2 голосов
/ 02 августа 2011

Я довольно новичок в VB.net и WPF (и программировании в целом), поэтому, пожалуйста, потерпите меня.Я пытаюсь написать полезное приложение для базы данных для своего бизнеса в качестве учебного проекта.Я сделал черновик в WinForms, ссылаясь на (очень хорошую) книгу Мурача, но сейчас пытаюсь переписать ее с помощью пользовательского интерфейса WPF и более чистого кода.

Мне кажется, я понимаю основы связывания WPF,но я рву свои волосы, пытаясь найти простой способ привязки к родительским деталям - что я бы посчитал очень простым сценарием, но я ничего не могу найти на нем.Например, допустим, у меня есть

  • таблица «Клиенты» с CustomerID, именем, различными контактными данными, а затем внешними ключами CityID и GroupID;
  • таблица «City» с CityID, CityName и внешний ключ StateID;
  • таблица 'State' с StateID, StateName;
  • a таблица 'Groups' с GroupID, GroupName и т. Д.

.... со строго типизированным набором данных, включающим отношения и набор табличных адаптеров.

Все, что я хочу сделать в этом случае, - это отобразить детали для конкретного клиента (когда пользователь ввел свой идентификатор клиента).Я легко могу связать данные в таблице «Клиенты», но как мне использовать привязки для извлечения CityName, StateName и GroupName из связанных таблиц? Частичный пример ниже.

...

<Window.Resources>
    <CollectionViewSource x:Key="CustomersViewSource" 
                            Source="{Binding Path=Customers,Source={StaticResource CustomersDataSet}}" />
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource CustomersViewSource}}">
    <TextBox Name="customerName" Text="{Binding Path=Name}" />
    <TextBox Name="customerPhone" Text="{Binding Path=PhoneNumber}" />
</Grid>
<Grid>
    <Label Name="lblGroup" Content="[needs to bind to GroupName]">
    <Label Name="lblCity" Content="[needs to bind to CityName]">
</Grid>

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

Если это не удастся, я смог сделать это только через VB - и это довольно неприятно.Предполагая, что я создал CustomerViewSource, посмотрел соответствующего клиента и заполнил различные таблицы в моем наборе данных, что-то вроде этого:

Dim rowCustomer As System.Data.DataRowView = CustomerViewSource.View.CurrentItem
Dim drCustomer As System.Data.Datarow = rowCustomer.Row
Dim drGroup as drCustomer.GetParentRow("FK_Customers_Groups")
lblGroup.Content = drGroup.Item("GroupName")

Хотя мне не следовало бы делать это так неуклюже ...я должен?

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

SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID = @CustomerID

, а затем просто перехожу кпервая запись (так как будет только одна).Это нормальный метод поиска клиента?Я также мог бы использовать этот метод, получая внешние ключи из строки моего клиента и заполняя различные таблицы в наборе данных, используя параметризованные запросы, а затем просто привязывая их к каждой таблице в отдельности - но опять-таки, кажется очень грязным.

AnyПомощь с этой проблемой, или даже общие советы, очень ценю.Если я не был достаточно ясен (или предоставил хорошие примеры), с удовольствием объясню дальше.Приветствия.

1 Ответ

1 голос
/ 02 августа 2011

Во-первых, это фактически дочерние строки, а не родительские. Это немного нелогично, но родитель - это «одна» сторона отношения «один ко многим», а ребенок - «многие», поэтому Группа, Город и Штат являются родителями Клиента. Ваш пример кода показывает это.

Далее, в ADO.NET вы можете выполнить все, что вы пытаетесь сделать, создав DataColumn в Customer DataTable и установив его выражение. Создайте столбец с именем StateName и установите для его выражения значение Parent(FK_Customers_States).StateName. Теперь вы можете связать его так же, как и любой другой столбец.

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