WPF XAML x: Тип подчеркнут и указывает, что «MyColor» не существует в пространстве имен .... Почему? - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь отобразить в 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"

Может кто-нибудь сказать мне, когда вы предполагаете использовать «сборочную» часть, а когда нет?

...