#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
. В противном случае Система не распознает изменение и не обновит пользовательский интерфейс.