Я нашел много ответов на этот вопрос, но я не могу получить синтаксис правильно. Я пробовал каждую логическую комбинацию, о которой я могу думать, учитывая объяснение here и многие другие, которые я нашел, но это все еще ускользало от меня через три недели. Мне просто нужно получить синтаксис права XAML.Что не так с этим синтаксисом привязки DataGridComboBoxColumn?
Классы: (переименовываются для простоты/конфиденциальности)
UserControl1 - содержит три глобальные списки, называемые улицы, дома, автомобили и
Street - содержит два списка только связанные с ним дома и машины, называемые MyHouses и MyCars
Дом - представлен в DataGrid, при этом одним столбцом является DataGridComboboxColumn, чтобы выбрать, с какой улицей этот дом связан. Имеет свойство Street, называемое Street, объявленное в нем, чтобы отслеживать это и выполнять другие вычисления в get/set.
Автомобиль - представлен в DataGrid, при этом одним столбцом является DataGridComboboxColumn, чтобы выбрать, с какой улицей связан этот автомобиль. Имеет свойство Street, называемое Street, объявленное в нем, чтобы отслеживать это и выполнять другие вычисления в get/set.
Если потребуется, я могу реорганизовать код позади, чтобы соответствовать указанному выше и опубликовать его.
XAML
<DataGrid ItemsSource="{Binding Streets, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Street" Binding="{Binding StreetID, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid ItemsSource="{Binding Cars, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding CarID, Mode=TwoWay}"/>
<DataGridComboBoxColumn
ItemsSource="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl1}, Mode=OneWay}"
SelectedItemBinding="{Binding Street}"
SelectedValue="{Binding StreetID}"
SelectedValuePath="StreetID"
DisplayMemberPath="StreetID">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl1}, Mode=OneWay}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl1}, Mode=OneWay}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
<DataGrid ItemsSource="{Binding Houses, Mode=TwoWay}">
<!--copy of Cars with changed names-->
</DataGrid>
В качестве пояснения все свойства, о которых я упоминал в своем первоначальном сообщении, являются фактически полями свойств Dependency Property, если это имеет значение. Ваш вопрос об установке элемента ItemsSource для DataGridComboBoxColumn помогает. Не могли бы вы рассказать об установщике? Это свойство ? Мне не нужен был бы стиль редактирования, верно? –
unwrittenrainbow
А я вижу. Что касается «Setter», то в настоящий момент поведение по умолчанию будет состоять в том, чтобы столбец передал выбранный объект «Street» в устройство set 'Street', потому что коллекция, связанная с ComboBox, представляет собой коллекцию« Street »(вы можете отлаживать сеттер и смотреть, что получится). Если вам вместо этого нужно передать 'StreetID' в свойство' StreetID' на вашем 'Car', вам нужно будет использовать установщик' SelectedValue', чтобы получить конкретное свойство. – Chris
Я думаю, что синтаксис, упомянутый выше ' ' будет правильным, но я думаю, что это поведение по умолчанию в этом случае (я не близок к моему макету Я не могу проверить). –
Chris