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
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
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>
...
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.
Jup, bei WPF geht das out of the box und für Silverlight guckst du hier: RelativeSourceBinding
grüßle
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 😉