Проблема привязки WPF ItemsControl

У меня проблема с привязкой: см. мой код

Это Xaml-код:

<ItemsControl x:Name="lbOpenInvoices" ItemsSource="{Binding Path=ocOpenInvoices}">
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <UniformGrid Columns="3" VerticalAlignment="Top" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Button x:Name="btnOpenInvoice" Click="btnOpenInvoice_Click" Style="{StaticResource OpenInvoicesButton}">
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding Converter={StaticResource InvoiceNoTableNo}}"/>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <TextBlock Text="{Binding Converter={StaticResource InvoiceNoInvoiceId}}"/>
                    <TextBlock Text="{Binding TotalAmount}" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </StackPanel>
                <TextBlock Text="{Binding Converter={StaticResource InvoiceDateTime}}"/>
            </StackPanel>
        </Button>
    </DataTemplate>
</ItemsControl.ItemTemplate>

In Code behind I have declared the ocOpenInvoices ObservableCollection:

        public ObservableCollection<Invoice> ocOpenInvoices { get; set; }

И в моем событии Window Loadded:

        void SaleWindow_Loaded(object sender, RoutedEventArgs e)
        {
          this.DataContext = this;
        }

Но это сводит меня с ума, потому что ItemControl не отвечает на ocOpenInvoices ObservableCollection.

Когда я даю ему ItemsSource из codebehind, он работает :(, я пытался дать ему ElementName, но он все еще не отвечает.

Пожалуйста, не могли бы вы помочь и сказать мне, что моя проблема? что мне здесь не хватает? Заранее спасибо.


person Abdulsalam Elsharif    schedule 06.04.2014    source источник
comment
Когда вы создаете ocOpenInvoices? до или после InitializeComponent(); Привязка может быть выполнена до того, как вы ее создали. Таким образом, он связывается с NULL.   -  person Jeroen van Langen    schedule 06.04.2014
comment
@JeroenvanLangen Я создаю его в Window Loaded   -  person Abdulsalam Elsharif    schedule 06.04.2014
comment
Кажется, все это работает (по крайней мере, в небольшом примере с использованием одного класса Window), можете ли вы воссоздать проблему в небольшом примерном проекте?   -  person Chris    schedule 06.04.2014


Ответы (2)


Попробуйте абстрагировать свою наблюдаемую коллекцию над приватной переменной, это сработает.

Заменять

public ObservableCollection<Invoice> ocOpenInvoices { get; set; }

с

private ObservableCollection<Invoice> _ocOpenInvoices;
public ObservableCollection<Invoice> ocOpenInvoices
{ 
  get { return _ocOpenInvoices ; } 
  set { _ocOpenInvoices = value; OnPropertyChange("ocOpenInvoices"); }
}

Пожалуйста, игнорируйте этот OnPropertyChange, если вы уже реализовали INotifyPropertyChanged по-своему, иначе INotifyPropertyChanged может решить вашу проблему.

person Mayur Dhingra    schedule 06.04.2014
comment
Это правильный ответ. Вот ссылка, которая тоже может помочь. msdn.microsoft.com/en-us/library /ms743695(v=vs.110).aspx - person FodderZone; 06.04.2014

Убедитесь, что вы инициализировали ObservableCollection в пределах Window's constructor или Window loaded event.

void SaleWindow_Loaded(object sender, RoutedEventArgs e)
{
   ocOpenInvoices = new ObservableCollection<Invoice>();
   this.DataContext = this;
}

Если вы инициализируете его в другом месте, убедитесь, что вы реализуете INotifyPropertyChanged и поднимите PropertyChanged.

person Rohit Vats    schedule 06.04.2014