Привязка WPF к сетке данных пользовательского управления

#c# #wpf

#c# #wpf

Вопрос:

У меня есть пользовательский элемент управления, который я пытаюсь использовать для использования во многих экземплярах. Но, похоже, я не могу заставить привязку работать должным образом.

Управляющий XAML, который у меня есть:

 <UserControl x:Class="EveCommon.WPF.Inventory.EveInventoryGrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:EveCommon.WPF.Inventory"
         mc:Ignorable="d" 
         x:Name="uc"
         d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
    <Style x:Key="HeaderRightJustify" TargetType="DataGridColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
    <Style x:Key="ColumnRight" TargetType="DataGridCell">
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
</UserControl.Resources>
<Grid>
    <DataGrid x:Name="ItemsDG" IsReadOnly="True" ItemsSource="{Binding Path=Inventory, ElementName=uc}" AutoGenerateColumns="False">
        <DataGrid.Columns>
        <!-- SETUP COLUMNS HERE -->
        </DataGrid.Columns>
    </DataGrid>
</Grid>
  

И код, лежащий в основе:

 public partial class EveInventoryGrid : UserControl
{
    public static DependencyProperty InventoryProperty = DependencyProperty.Register(
        "Inventory", 
        typeof(EveInventory),
        typeof(EveInventoryGrid));

    public EveInventory Inventory
    {
        get { return (EveInventory)GetValue(InventoryProperty); }
        set { SetValue(InventoryProperty, value); }
    }
}
  

И, наконец, вызов из Mainwindow.

 <inventory:EveInventoryGrid x:Name="ItemsView" Grid.Column="1" Inventory="{Binding Path=Inventory}"  ShowName="True" ShowCost="True"/>
  

Inventory является экземпляром EveInventory и реализует INotifyPropertyChanged.

Я просто не вижу / понимаю, чего мне здесь не хватает.

Комментарии:

1. Не могли бы вы немного подробнее рассказать о `Но, похоже, я не могу заставить привязку работать должным образом`.? Было бы полезно понять, что не работает.

2. Я вижу, что экземпляр объекта главного окна заполняется, но пользовательский интерфейс не обновляется информацией.

3. Ты звонишь PropertyChanged() ? Это то, что вам нужно будет сделать при обновлении значений в пользовательском интерфейсе. Просто реализации INotifyPropertyChanged недостаточно.

4. Итак, я реализовал INotifyPropertyChanged и вызвал его в главном элементе управления. EveInventory имеет свойство Items, которое является списком<T>, и имеет средство получения / установки, которое при вызове вызовет свойство, измененное. Однако, похоже, что PropertyChanged не вызывается, когда я обновляю инвентарь…

5. Для коллекций взгляните на: ObservableCollection . При привязке к коллекции, которую вы хотите использовать ObservableCollection вместо обычного List

Ответ №1:

Как объяснялось выше, вам придется использовать ObservableCollection<T> вместо List<T> при использовании привязок с INotifyPropertyChanged . В противном случае Система не распознает изменение и не обновит пользовательский интерфейс.