Я пытаюсь отобразить в DataGrid ObservableCollection. Для каждого элемента в ObservableCollection у меня есть ComboBox, который отображает выбранный в данный момент элемент (MyColor в моем примере) и позволяет пользователю выбрать другой цвет из выпадающего списка. Это работало достаточно хорошо, когда мой Enum MyColor находился в том же пространстве имен, что и MainWindow. Однако, чтобы приблизить пример к проблеме, которую я на самом деле пытаюсь решить, я поместил перечисление MyColor в другой проект и пространство имен. Я включил весь код. В XAML для главного окна у меня есть ObjectDataProvider и строка
<x:Type TypeName="enu:MyColor" />
Слово x: Тип подчеркнуто и имеет сообщение: Имя MyColor не существует в пространстве имен "clr-namespace: Library .EnumDefinitions; assembly = Library.EnumDefinitions "Я дважды проверял орфографию, но не вижу проблемы. MyColor определяется в пространстве имен Library.EnumDefinitions. Мне интересно, вызывает ли меня горе тот факт, что enum находится в отдельном пространстве имен и проекте? Идея использования ObjectDataProvider может быть найдена здесь, например: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/ Предложение о том, что может произойти что-то особенное, если ваш enum находится в другом проекте / пространстве имен, приведено здесь: Имя не существует в пространстве имен в приложении WPF У меня есть ссылка на другой проект в моем основном проекте.
Есть идеи, что происходит? Если я могу предоставить другую информацию, пожалуйста, дайте мне знать.
Спасибо, Дейв
MainWindow XAML
<Window x:Class="TrickyBindingProblems.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:enu="clr-namespace:Library.EnumDefinitions;assembly=Library.EnumDefinitions"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<ObjectDataProvider x:Key="EnumDataProvider" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="enu:MyColor" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<Grid>
<DataGrid Grid.Column="1"
Margin="0"
HorizontalAlignment="Left"
AutoGenerateColumns="False"
Background="Transparent"
DataContext="{Binding}"
HeadersVisibility="Column"
ItemsSource="{Binding Cars}"
SelectedItem="{Binding SelectedItemProperty, Mode=TwoWay}"
RowBackground="Transparent"
RowHeight="30">
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="FontWeight" Value="Bold" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Width="*" Header="Make">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center"
Padding="5"
Text="{Binding Make}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="*" Header="Color (as ComboBox)">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" SelectedItem="{Binding Color, Mode=TwoWay}">
<ComboBox.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Black" />
</Style>
</ComboBox.Resources>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
namespace Library.EnumDefinitions
{
public enum MyColor
{
Red,
Blue,
Green
}
}
ОБНОВЛЕНИЕ !! ! Я считаю, что я решил свою непосредственную проблему. Я изменил строку:
xmlns:enu="clr-namespace:Library.EnumDefinitions;assembly=Library.EnumDefinitions"
на:
xmlns:enu="clr-namespace:Library.EnumDefinitions"
Может кто-нибудь сказать мне, когда вы предполагаете использовать «сборочную» часть, а когда нет?