У меня есть поле со списком DataGridTemplateColumn, которое привязывается к отдельному элементу ItemsSource. Кажется, привязывая этот combobox к другому источнику, он меняет DataContext.WPF bind DataGrid combo box selected item to datacontext выбранного DataGridRow
Так что у меня возникают проблемы, связывающие значение выбранного элемента в поле со списком с DataContext выбранной строки в DataGrid.
XAML:
<DataGrid HorizontalAlignment="Left" ItemsSource="{Binding Path=WorldDataList}" SelectedItem="{Binding SelectedWorldData}">
<DataGridTemplateColumn Header="Country" >
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}},Path=DataContext.Countries}"
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=SelectedItem.Country}"
SelectedIndex="0"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid>
C#:
class WorldDataViewModel : ObservableObject
{
private ObservableCollection<WorldData> _worldDataList = new ObservableCollection<WorldData>();
public ObservableCollection<WorldData> WorldDataList
{
get { return _worldDataList; }
set
{
Set(ref _worldDataList, value);
}
}
public List<string> Countries {get;set;}
private WorldData worldData;
private WorldData SelectedWorldData
{
get{return worldData;}
set
{
Set(ref worldData, value);
}
}
}
class WorldData : ObservableObject
{
private string country;
public string Country
{
get{return country;}
set
{
Set(ref country, value);
}
}
я получаю исключение:
System.Windows.Data Error: 23 : Cannot convert '{NewItemPlaceholder}' from type 'NamedObject' to type 'WorldData' for 'en-US' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: TypeConverter cannot convert from MS.Internal.NamedObject. at System.ComponentModel.TypeConverter.GetConvertFromException(Object value) at System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)' Exception thrown: 'System.NotSupportedException' in PresentationFramework.dll
Похоже, я должен использовать конвертер типа, но, кажется, я не должен сделайте это с самых маленьких, которые я смог найти на SO
Я думаю, что на данный момент я просто сдаюсь и добавлю отдельный блок для combobox и привяжу к выбранному элементу Datagrid. Я не считаю это интуитивным, поэтому, если у вас есть умные идеи.
Hi gomi42. Просто увидев это. Вы смогли привязаться к SelectedCountry? Вы поставили точку останова в SelectedWorldData.Country, чтобы увидеть, действительно ли она отображается, когда вы выбираете страну? Мне также нужно, чтобы CanUserAddRows был правдой. Спасибо за вашу попытку, хотя –
Прошу прощения, я обновил свой первый ответ. Теперь я могу установить перерыв в 'Country', и отладчик останавливается там. – gomi42
Я забыл упомянуть, что вы можете установить «CanUserAddRows» в true. Я отключил его, потому что новая создаваемая строка показывает Combobox, которая может быть немного запутанной с точки зрения UX. Опять же нет технических ограничений. – gomi42