web-dev-qa-db-fra.com

Comment puis-je lier un ItemsControl.ItemsSource avec une propriété en XAML?

J'ai une fenêtre simple:

<Window x:Class="WinActivityManager"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
    <Grid>
        <ListView x:Name="lvItems" />
    </Grid>
</Window>

Et le code associé derrière:

public partial class WinActivityManager : Window
{
    private ObservableCollection<Activity> Activities { get; set; }

    public WinActivityManager()
    {
        Activities = new ObservableCollection<Activity>();
        InitializeComponent();
    }

    // Other code ...
}

Si j'écris la liaison suivante dans le constructeur de fenêtre:

lvItems.ItemsSource = Activities;

puis mon ListView est automatiquement mis à jour lorsque j'ajoute ou supprime des éléments de Activities.

Comment dois-je écrire la liaison en XAML?
J'ai essayé mais cela ne fonctionne pas:

<ListView x:Name="lvItems" ItemsSource="{Binding=Activities}" />

Comment faire pour que cela fonctionne en XAML?

9
Jonny Piazzi

Ce que @JesseJames dit est vrai mais pas suffisant.

Vous devez mettre

private ObservableCollection<Activity> Activities { get; set; } 

comme

public ObservableCollection<Activity> Activities { get; set; }

Et la liaison devrait être:

<ListView x:Name="lvItems" ItemsSource="{Binding Path=Activities}" />

Cordialement,

13
sexta13

Vous devez définir DataContext sur this comme d'autres l'ont répondu, mais vous pouvez également définir DataContext à xaml:

<Window x:Class="WinActivityManager"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <ListView x:Name="lvItems" ItemsSource="{Binding Path=Activities}" />
    </Grid>
</Window>
12
Farhad Jabiyev

Ensemble DataContext = this dans le constructeur Window.

public WinActivityManager()
{
    Activities = new ObservableCollection<Activity>();
    DataContext = this;
    InitializeComponent();
}

Ensuite, vous pourrez lier des activités comme vous le souhaitez: <ListView x:Name="lvItems" ItemsSource="{Binding=Activities}" />

2
opewix

En effet, le contexte de données de votre vue n'a pas été défini. Vous pouvez soit le faire dans le code derrière:

this.DataContext = this;

Vous pouvez également définir DataContext de la fenêtre sur lui-même - DataContext="{Binding RelativeSource={RelativeSource Self}}"

Vous êtes beaucoup mieux en enquêtant sur le modèle de conception MVVM , et en utilisant un framework MVVM .

1
devdigital