Для двунаправленной привязки требуется исключение «Путь» или «XPath». Windows WPF - PullRequest
0 голосов
/ 31 января 2020

В Datagrid, который выглядит следующим образом, я получаю исключение:

<DataGrid x:Name="ModuleGrid" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Module Name" Binding="{Binding Path=Name}"/>
        <DataGridTextColumn Header="uName" Binding="{Binding Path=UniqueName}"/>
        <DataGridTemplateColumn Header="Features">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Feature.Name}"></TextBlock>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=Features}"
                              SelectedItem="{Binding Path=Feature}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Name}"></TextBlock>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Пока все хорошо, почти все работает отлично. Но когда я выбираю пункт в моем ComboBox:

enter image description here

, я получаю исключение:

System.InvalidOperationException: "D ie bidirektionale Bindung erfordert" Путь "или" XPath "."

Код C# является объектом, который содержит список функций (List<Feature>), который содержит Feature s. Я инициализирую его так:

 List<Module> test_3 = pPP_2.Components.Modules.Values.Cast<Module>().ToList();
 ModuleGrid.ItemsSource = test_3;

Редактировать: Класс модуля:

class Module
    {
        public string Name { get; set; }
        public string UniqueName { get; set; }
        public Dictionary<Property, double> Properties { get; set; }
        public List<Feature> Features { get; set; }

        private Dictionary<Material, double> content = new Dictionary<Material, double>();
        public Dictionary<Material, double> Content
        {
            get { return content; }
            set { content = value; }
        }
        public double FillingCapacity { get; set; }
        public double FillingAmount
        {
            get
            {
                double ret = 0;
                foreach (double a in Content.Values)
                {
                    ret += a;
                }
                return ret;
            }
        }
    }

Класс объекта:

class Feature
    {
        public string Name { get; set; }
        public string FeatureType { get; set; }
        public Property UsedProperty { get; set; }
        public double MinValue { get; set; }
        public double MaxValue { get; set; }
        public double ChangePerMinutePerLiter { get; set; }
    }

Класс свойства:

    class Property
    {
        public string Name { get; set; }
        public double DefaultValue { get; set; }
        public string Unit { get; set; }
    }

1 Ответ

2 голосов
/ 31 января 2020

Похоже, что для выпадающего списка функций вы привязываетесь к внутреннему раскрывающемуся списку значений объекта Modules и хотите изменить этот список на один элемент ... где его можно выбрать? Это не имеет смысла.


Чтобы устранить проблему, выполните следующие действия:

  1. Прежде всего, вам нужен список c (неизменный) списка функций, к которым можно привязаться.
  2. Удалите Features из Module и замените его свойством id, прямо сейчас, чтобы избежать путаницы, назовите его FeatureName.
  3. Используйте DataGridComboBoxColumn, который допускает одно значение быть измененным на основе идентификатора. К сожалению, идентификатор класса Feature равен Name. Чтобы быть более реалистичным c, это должно быть числовое поле Id на Feature, которое может идентифицировать и ассоциировать этот путь; как упомянуто в # 2, сейчас мы будем называть наш идентификатор FeatureName, чтобы избежать путаницы.

Шаг 1 Этот шаг устанавливает свойство public для List<string> с именем FeatureList в канале данных вашего окна (или страницы, или элемента управления) (ВМ?), Куда вы загрузите значения идентификатора из всех функций, таких как эти строки: { "Heinzen", "Coolen", "Ein", "Klinen", "Yagermeisters", ... } снова, этот список из String с (не Feature с).

Затем поместите этот список в ресурсы страницы, например,

<Window.Resources>

    <CollectionViewSource x:Key="FeatureList"
                          Source="{Binding FeatureList}" />

</Window.Resources> 

Шаг 2 Удалить от Module public List<Feature> Features { get; set; } и замените его на public string FeatureName { get; set; }

Шаг 3 Теперь вы замените Frankenstein DataGridTemplateColumn, где у вас был комбинированный ящик, на более цивилизованным DataGridComboBoxColumn. Что позволит отображать и редактировать / выбирать значения, которое будет выбирать / отображать функцию.

Поставьте это так:

<DataGridComboBoxColumn Header="Feature"
                        SelectedItemBinding="{Binding FeatureName, Mode=TwoWay}"
                        ItemsSource="{Binding Source={StaticResource FeatureList}}"
                        Width="100" />

Это должно дать вам хорошее начало в вопросе и как правильно использовать комбинированный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...