Хорошо, я собираюсь предложить совершенно другое направление, чем мое первое. Я предполагаю, что у вас есть ItemSource для grdDatasets, привязанный к чему-либо.
Для элемента, который будет выступать в качестве вашего текста данных для элемента управления, убедитесь, что он имеет следующие характеристики или, по крайней мере, сопоставимую структуру:
public class ListOfDataSets : DependencyObject
{
public IEnumerable<DataSetOption> Items
{
get
{
...Whatever you normally use to get your DataSetOptions...
}
}
public DataSetOption SelectedItem
{
get { return (DataSetOption)GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register("SelectedItem", typeof(DataSetOption), typeof(ListOfDataSets), new PropertyMetadata(null));
}
Ключевым моментом здесь является то, что у вас есть одно свойство, представляющее собой список ваших выборов, и другое свойство, представляющее один из этих элементов.
Тогда в вашем XAML ваш элемент управления может иметь следующую структуру:
<UserControl>
<UserControl.Resources>
<ConfigurationTool:ListOfDatasets x:Key=DataSetOptions />
</UserControl.Resources>
<StackPanel Name="LayoutRoot">
<DataGrid Name="grdDatasets"
ItemsSource="{Binding Source={StaticResource DataSetOptions}, Path=Items}"
SelectedItem="{Binding Source={StaticResource DataSetOptions}, Path=SelectedItem}"
...
</DataGrid>
...
<DataGrid Name="OtherDataGrid" ItemsSource="{Binding OtherSource}">
<DataGrid.Columns>
...
<DataGridTemplateColumn Header="Database-Fieldtype" Width="Auto" IsReadOnly="False" SortMemberPath="DatabaseFieldType">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding DatabaseFieldType}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{StaticResource DataSetOptions}, Path=SelectedItem.Storage.DatabaseFieldTypes}" SelectedItem="{Binding DatabaseFieldType, Mode=TwoWay}"
VerticalAlignment="Top" Width="179" Padding="0" Margin="0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</Datagrid.Columns>
</DataGrid>
</StackPanel>
</UserControl>
Я действительно опробовал эту структуру, и привязка данных работает отлично. Однако если DataSetOptions сильно меняется, это решение может не сработать, если вы не используете MVVM, а ViewModel хорошо отслеживает доступные параметры и правильно отображает их в представлении.
Надеюсь, это имеет смысл. Я действительно попробовал это, прежде чем ответить.
Я не был прав в своем первоначальном ответе и переоценил возможности RelativeSource до того, как начал экспериментировать с ним.
--- Оригинальный текст ниже ---
Я думаю, что могу помочь, но мне нужно еще несколько деталей. А пока я просто отработаю предположения.
Предположение 1: вы находитесь в WPF UserControl с DataGrid, у которого есть определенный ItemsSource.
Предположение 2: UserControl имеет еще один элемент, к которому у столбца в вашей DataGrid должен быть доступ.
Если эти два предположения верны, в WPF гораздо лучше иметь дело, чем в Silverlight.
Каждая строка в вашей DataGrid будет работать из DataContext, который состоит из Item для этой строки. Но вы можете выйти за пределы DataContext ячейки (или любого другого) с помощью RelativeSource.
Итак, если вы хотите подняться по дереву визуалов, чтобы получить ширину вашего элемента управления, вы должны использовать:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyUserControl}}, Path=Width}
Это будет проходить вверх по визуальному дереву до тех пор, пока не будет найден объект типа «MyUserControl», после чего он получит свойство «Ширина» и свяжется с ним.
Путь не обязательно должен быть только одним предметом. Вы можете запустить ваше визуальное дерево по мере необходимости. Однако по мере того, как это усложняется, ваш код будет более хрупким.
Если это не так, пожалуйста, опубликуйте свой XAML (или что-то подобное) и скажите так, и я раскрою тестовую среду и отредактирую свой пост.