Преобразование элемента внутри DataGrid - PullRequest
0 голосов
/ 05 августа 2020

У меня есть «главный список» всех существующих предметов. Затем у меня есть класс (называемый Inventory), который отвечает за отслеживание количества элементов, количество может быть любым целым числом.

My DataGrid привязывается к главному списку, а затем к конкретному * Столбец 1029 * отвечает за отображение количества предметов в инвентаре. Класс Inventory - это IValueConverter.

Моя идея состоит в том, чтобы преобразовать Item из DataGrid в int (количество имеющихся у меня элементов) с помощью класса Inventory.

XAML:

<UserControl>

    <UserControl.Resources>
        <converters:Inventory x:Key="FindQuantity"/>
    </UserControl.Resources>

              
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MasterList}"> <!-- Binding to the master List -->
        <DataGrid.Columns>

            <DataGridTemplateColumn Header="Quantity">
                <DataGridTemplateColumn.CellTemplate>

                    <DataTemplate>
                        <!-- Converting: -->
                        <TextBlock Text="{Binding Converter={StaticResource FindQuantity}}"/>
                    </DataTemplate>

                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>
    </DataGrid>
</UserControl>

Часть скрипта инвентаризации:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  var item = (Item)value; //<------------Here's where the Debug points the error
  return HowMany(item);
}

public int HowMany(Item item)
{
  if (storage.ContainsKey(item))
    return storage[item];
  else return 0;
}

Я получаю ошибку:

System.InvalidCastException: 'Невозможно преобразовать объект типа' MS.Internal .NamedObject ', чтобы ввести' Playfield2_WPF.Objetos.Item '.'

Я новичок в WPF, поэтому не совсем понимаю привязку. Где моя ошибка? У меня что-то не так с работой привязок или проблема в другом? Спасибо.

Изменить:
Вот код для «MasterList» (это список ObservableObject, класса, реализующего INotifyPropertyChanged. Исходный код: https://pastebin.com/wZiis6rF)


public class Inventary : ObservableObject, IValueConverter
{       
  private List<Item> _masterList;
  public List<Item> MasterList
    {
        get { return _masterList; }
        set
        {
          //this method is from the ObservableObjet class
          //It basically calls PropertyChanged from the INotifyPropertyChanged interface
            OnPropertyChanged(ref _masterList, value, nameof(MasterList)); 
        }
    }

}
   //Item is basically some int and string propierties
    public class Item : ObservableObject 
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                OnPropertyChanged(ref _name, value, nameof(Name));
            }
        }

        private decimal _cost;
        public decimal Cost
        {
            get { return _cost; }
            set
            {
                OnPropertyChanged(ref _cost, value, nameof(Cost));
            }
        }

    }


1 Ответ

0 голосов
/ 06 августа 2020

Ниже приведены два примера конвертера.

Один: привязка к другому элементу управления

<RadioButton  IsChecked="False" x:Name="targetradiobutton"/>
<!-- Below is a textbox that will show/hide depends on radiobutton's isChecked state!-->
<TextBlock Visibility="{Binding IsChecked, ElementName="targetradiobutton", Converter={StaticResource BooleanToVisibilityConverter}}"/>

Два: привязка к внутренней переменной

В test.xaml.cs

Public Test(){ this.DataContext = this;} //one of a way to bind to backend class. there's other way too
Public bool IsVisible{ get; set;}

В test.xaml

<!--Converting backned boolean to visibility.
<TextBlock Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>

Пример преобразователя:

public class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool)
            {
                return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
            }
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

В вашем случае, поскольку вы используете привязку по умолчанию, вы привязываете текст текстового поля к конвертеру. Таким образом, вы можете на основе приведенного выше примера выполнить привязку к переменной / другому элементу, который содержит нужный вам целевой элемент.

  <!-- Converting: -->
  <TextBlock Text="{Binding TargetItem, Converter={StaticResource FindQuantity}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...