Laden...

Binding von Commands aus einer Liste an VM

Erstellt von Boris0815 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.504 Views
B
Boris0815 Themenstarter:in
225 Beiträge seit 2008
vor 12 Jahren
Binding von Commands aus einer Liste an VM

Hiho,

ich habe ein Problem mit dem Binding von Commands mit Buttons in einer Liste.
Ich habe ein UserControl, welches die Liste beinhaltet, sowie ein Anwendung mit meinem VM.
Das UC bekommt eine List mit einer eigenen Datenklasse gebunden. Das Funktioniert auch soweit. Das UC beinhaltet, aber auch Buttons die an Commands gebunden werden. Ich weiß nun aber nicht wie ich das Commandbinding im XAML machen muss, da der eigentliche DataContext in dem Fall ja ein ListItem ist.

Hier mein UC:

<UserControl ...>
    <Grid>
        <Expander Header="{Binding Path=ExpHeader}" IsExpanded="False">
            <ItemsControl ItemsSource="{Binding Path=IncomingInvites}" x:Name="list" >
                <ItemsControl.ItemTemplate>
                    <DataTemplate >
                        <StackPanel Orientation="Horizontal">                        
                            <Label Content="{Binding Path=Invite}"/>
                            <Button Command="{Binding Path=DataContext.AcceptInvite}" CommandParameter="{Binding Path=NetID}">Annehmen</Button>
                            <Button Command="{Binding ElementName=NetAdminFrame, Path=DataContext.DeclineInvite}" CommandParameter="{Binding Path=AwengaNetID}">Ablehnen</Button>
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Expander>
    </Grid>
</UserControl>

Im Xaml sieht man zwei meiner gescheiterten Versuche die Commands zu binden. 😃

Mein VM:


...
        private List<IncomingInvite> incomingInvites = new List<IncomingInvite>();
        public List<IncomingInvite> IncomingInvites
        {
            get { return incomingInvites; }
            set
            {
                incomingInvites = value;
                NotifyPropertyChanged("IncomingInvites");
            }
        }
...
        RelayCommand declineInvite;
        public ICommand DeclineInvite
        {
            get
            {
                if (declineInvite == null)
                {
                    declineInvite = new RelayCommand(param => this.DeclineInviteMethod(param),
                        param => true);
                }
                return declineInvite;
            }
        }


        RelayCommand acceptInvite;
        public ICommand AcceptInvite
        {
            get
            {
                if (acceptInvite == null)
                {
                    acceptInvite = new RelayCommand(param => this.AcceptInviteMethod(param),
                        param => true);
                }
                return acceptInvite;
            }
        }
...

Kann mir jemand bitte weiterhelfen?

Gruß

Boris

Gelöschter Account
vor 12 Jahren

Hallo

Erstell doch ein ViewModel für IncomingInvite und implementier dort deine zwei Commands, dann kannst du auf diese Binden.

Dann must du nur noch die List Umändern in etwas wie:


 public List<IncomingInviteViewModel> IncomingInvites
{
    get { return incomingInvites; }
    set
    {
         incomingInvites = value;
         NotifyPropertyChanged("IncomingInvites");
     }
 }

Mfg. MusiuminCapitiss

B
Boris0815 Themenstarter:in
225 Beiträge seit 2008
vor 12 Jahren

Hmm, ich denke das sollte auch anders gehen.

Mit diesem Binding müsste ich doch das VM des übergeordneten Controls erreichen, oder nicht?

<Button Command="{Binding ElementName=NetAdminFrame, Path=DataContext.DeclineInvite}" CommandParameter="{Binding Path=NetID}">Ablehnen</Button>

Übergeordnetes Control:

<UserControl x:Class="NetAdminFrame.NAFrame" x:Name="NetAdminFrame"
...
        <StackPanel >
            <daco:NewNetUC x:Name="newNet" />
            <daco:IncomingInvitesUC x:Name="incInvUC" />
        </StackPanel>
...
297 Beiträge seit 2008
vor 12 Jahren

Je nachdem, ob du WPF oder Silverlight verwendest, kannst du das RelativeSource-Binding in Kombination mit dem AncestorType verwenden.

There are 10 kind of people, those who understand binary and those who don't.

849 Beiträge seit 2006
vor 12 Jahren

Jup, bei WPF geht das out of the box und für Silverlight guckst du hier: RelativeSourceBinding

grüßle

5.742 Beiträge seit 2007
vor 12 Jahren

Erstell doch ein ViewModel für IncomingInvite und implementier dort deine zwei Commands, dann kannst du auf diese Binden.

Würde ich auch empfehlen - sonst wird's sehr schnell unübersichtlich und chaotisch 😉