Daha iyi bir şekilde, (hızla zaten silinecek çünkü) öğeyi seçerek gerçekten ilgilenmediğini beri CommandParameter olarak Komutanlığı'na öğenin kendisini geçmek olacaktır.
Alternatif olarak, arkasından ya da tetikleyicilere sahip döner bir şekilde devam edebilirsiniz, ancak konuyla ilgili olacağını sanmıyorum. Örneğin:
Eğer liste üzerinde ButtonBase.Click olayını ele verebilir, geride kodunuzda sonra
<ListBox ButtonBase.Click="lb_Click"
...
gibi Bunu yapmak:
tıklandığında bağlı öğeyi alır
private void lb_Click(object sender, RoutedEventArgs e)
{
object clicked = (e.OriginalSource as FrameworkElement).DataContext;
var lbi = lb.ItemContainerGenerator.ContainerFromItem(clicked) as ListBoxItem;
lbi.IsSelected = true;
}
, Çünkü düğmenin datacontext öğesinin öğesinden, daha sonra gerçek otomatik olarak listelenen ListBoxItem ListBox'ın ItemContainerGenerator öğesinden devralınır ve IsSelected özelliğini true olarak ayarlar. Bence bu en hızlı ve en kolay yollardan biri. Ayrıca şablonda birden fazla ButtonBase türetilmiş nesne ile çalışır. yeniden kullanılabilir Behavior olarak Tabii
ayrıca daha güzel bütün bu (az ya da çok aynı) sarabiliriz:
<ListBox xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" ...>
<i:Interaction.Behaviors>
<local:SelectItemOnButtonClick />
</i:Interaction.Behaviors>
</ListBox>
hata ekleyin:
public class SelectItemOnButtonClick : Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(handler), true);
}
protected override void OnDetaching()
{
this.AssociatedObject.RemoveHandler(ButtonBase.ClickEvent, new RoutedEventHandler(handler));
base.OnDetaching();
}
private void handler(object s, RoutedEventArgs e)
{
object clicked = (e.OriginalSource as FrameworkElement).DataContext;
var lbi = AssociatedObject.ItemContainerGenerator.ContainerFromItem(clicked) as ListBoxItem;
lbi.IsSelected = true;
}
}
Böyle kullanabilirsiniz En azından boş çekler gibi kod işleme tabii ki - bu, uygulamanızı bombalamak gibi basit bir şey istemez.
Sorunu anlamak için, düğme, üzerinde işlem yapılan tüm fare olayları için Handled özelliğini true olarak ayarlar (MouseDown/Click), böylece ListBoxItem tarafından dikkate alınmazlar. Ayrıca, ListBox için MouseDown olayını ekleyebilir ve üstteki ListBoxItem'e ulaşıncaya kadar görsel ağacı yukarı doğru yürütebilirsiniz, ancak bu çok daha zor ... eh merak ediyorsanız, nedenini bilmeniz için this article okuyabilirsiniz. Ayrıca, FrameworkContentElements (aynı zamanda MouseDown'a yanıt verir) ile karşılaşırsınız, böylece kod daha karmaşık hale gelir, bu durumda datatemplate içinde tıklanmış olan herhangi bir şey, olayın elleçlenip işaretlenmediğine bakılmaksızın, seçilecek ListBoxItem'i tetikler.
Heh, Ben de yalnızca üslup ve tetikleyicilerle yapmayı denedim, ancak çirkin bir şekilde hızlı oldu ve ilgimi kaybettim (ve tüm err şeylerini kaybettim). Temelde çözülebilirdi, sanırım, ama yine de çok zahmete değer olduğunu düşünmüyorum. Belki de açık bir şeyi gözden kaçırdım, bilmiyorum.
Düğmeyi komut aracılığıyla geçirebilirim ve diğer taraftaki düğmeyi bulabilirim, ama bu bir kesmek gibi hissediyorum ... –
Cevabımı sildim (örneğin, ListBoxItem öğesini seçen bir tetikleyici ekleyin) klavye odağı içinde olduğunda) çünkü ikinci düşüncede, çoğu durumda bunun üstesinden gelmenin en iyi yolu olmayabilir. – ASanch
Aynı burada. Benim ilk çözüm CommandParameter için "Self" ve "çalıştırılan" yöntemine bağladıktan sonra LisBoxItem'i aşağıdaki gibi aldım: ListBoxItem selectedListBoxItem = ((ListBoxItem) MyListBox.ContainerFromElement ((DependencyObject) e.Parameter)); Ama bunun çok temiz olduğunu sanmıyorum ... –