Я пытаюсь включить столбец ComboBox в WPat datagrid. Я пытаюсь связать этот столбец с наблюдаемой коллекцией в ViewModel, однако во время выполнения ячейки остаются пустыми. Datacontext правильный, так как все нормальные столбцы успешно связываются. Я хочу отобразить "regionShortCode" в пользовательском интерфейсе. Вот мой xaml:
<DataGridComboBoxColumn Header="Region" DisplayMemberPath="regionShortCode" Width="SizeToHeader">
<DataGridComboBoxColumn.ElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding Path=MembershipsCollection}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding Path=MembershipsCollection}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
И вот мой ObservableCollection, объявленный в ViewModel. Коллекция успешно заполнена методом, вызванным в конструкторе:
private ObservableCollection<tbAccountMembership> _MembershipsCollection;
public ObservableCollection<tbAccountMembership> MembershipsCollection
{
get { return _MembershipsCollection; }
set
{
_MembershipsCollection = value;
OnPropertyChanged("MembershipsCollection");
}
}
Во время выполнения я получаю:
System.Windows.Data Error: 40 : BindingExpression path error: 'MembershipsCollection' property not found on 'object' ''tbAccountMembership_041E43AFC29975F12C156BA1373ACD47FC07BBE55614E5AF8AD3BBD9F090C133' (HashCode=46247020)'. BindingExpression:Path=MembershipsCollection; DataItem='tbAccountMembership_041E43AFC29975F12C156BA1373ACD47FC07BBE55614E5AF8AD3BBD9F090C133' (HashCode=46247020); target element is 'TextBlockComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')
в окне вывода. Почему Xaml не может решить эту привязку? благодаря
Если вы хотите привязать данные к одному свойству коллекции в модели представления из DataGrid
, тогда ваш ответ на Почему не может Xaml решить эту привязку? потому что вы не сказали Framework, где искать фактическое свойство... вам нужно использовать [RelativeSource Binding
] 1. Попробуйте это вместо этого:
<DataGridComboBoxColumn Header="Region" DisplayMemberPath="regionShortCode"
Width="SizeToHeader">
<DataGridComboBoxColumn.ElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding
DataContext.MembershipsCollection, RelativeSource={RelativeSource
AncestorType={x:Type YourViewModelsPrefix:YourViewModel}}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding
DataContext.MembershipsCollection, RelativeSource={RelativeSource
AncestorType={x:Type YourViewsPrefix:YourView}}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
С помощью этого Binding Path
YourView
Framework будет выглядеть вне нормального DataGrid.DataContext
для свойства с именем MembershipsCollection
в объекте, который задан как DataContext
для YourView
(очевидно, это не настоящее имя) UserControl
или Window
. Если y наша модель представления правильно установлена как DataContext
тогда это должно работать нормально.
Вы должны предоставить точный путь к коллекции для привязки к источнику items из combobox. для этого сделайте своего предка в качестве основного элемента управления, т.е. окна или пользовательского контроля
<DataGridComboBoxColumn Header="Category"
SelectedValueBinding="{Binding category_cde}"
SelectedValuePath="category_cde"
DisplayMemberPath="category_dsc">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=CATEGORIES , RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=CATEGORIES , RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
И вот коллекция категорий i, определенных в коде, где категория - это какой-то класс, вы можете определить свою собственную коллекцию
List<Category> m_categories = new List<Category>();
public List<Category> CATEGORIES
{
get { return m_categories; }
set { m_categories = value; }
}
Гораздо проще решить проблему с DataGridComboBoxColumn - это установить программную привязку ItemSource в конструктор класса Window.
<DataGrid x:Name="MembershipGridNormal" AutoGenerateColumns="False" SelectedIndex="0" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Prop1}"/>
<DataGridTextColumn Header="Value" Binding="{Binding Prop2}"/>
<DataGridComboBoxColumn x:Name="CmbMemberShips" Header="RawValues" DisplayMemberPath="Name" />
</DataGrid.Columns>
</DataGrid>
в коде
public Win32599087()
{
InitializeComponent();
MemberShipGridNormal.DataContext = myCollection;
Binding b = new Binding();
b.Source = myCollection;
b.Path = new PropertyPath("collectionpropertyname");
BindingOperations.SetBinding(CmbMemberships, DataGridComboBoxColumn.ItemsSourceProperty, b);
}
RelativeSource Binding
.