2011-08-01 59 views
2

我有我的應用程序列表框2使用按鈕風格的列表框似乎不工作

<Window.Resources> 
    <ItemsPanelTemplate x:Key="WrapPanelTemplate"> 
     <WrapPanel Width="290"/> 
    </ItemsPanelTemplate> 
    <DataTemplate x:Key="ButtonItemTemplate"> 
     <Button Content="{Binding Path=Name}" Width="120" Margin="3,2,3,2" /> 
    </DataTemplate> 
</Window.Resources> 

一切看起來不錯,但是當我嘗試點擊他們,他們不會選擇一個新的項目。我將SelectedItem綁定到了我的視圖模型上的一個屬性,但每當我選擇一個新項目時,set方法都不會發生。我有一個常規的列表框,它以相同的方式連接起來並且可以工作。這裏是自定義列表框的實現:

<ListBox Height="284" HorizontalAlignment="Left" x:Name="faveProgramsButtons" 
    ItemsSource="{Binding Path=FavoriteAppList}" 
    SelectedItem="{Binding Path=FavoriteAppList_SelectedApp}" VerticalAlignment="Top" 
    Width="281" ItemsPanel="{StaticResource WrapPanelTemplate}" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ItemTemplate="{StaticResource ButtonItemTemplate}"> 
</ListBox> 

謝謝!

回答

3

問題是Button正在吞嚥鼠標點擊,因此ListBox中的ListBoxItem從不接收它,因此它從不被選中。如果你希望能夠選擇的項目,當您點擊Button你可以嘗試使用ToggleButton代替並結合IsCheckedIsSelected

<DataTemplate x:Key="ButtonItemTemplate"> 
    <ToggleButton Content="{Binding Path=Name}" Width="120" Margin="3,2,3,2" 
        IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, 
             Path=IsSelected, 
             Mode=TwoWay}"/> 
</DataTemplate> 

你也可以用後面的小碼或附加的行爲實現這一目標。

ButtonItemTemplate

<DataTemplate x:Key="ButtonItemTemplate"> 
    <Button Content="{Binding Path=Name}" Width="120" Margin="3,2,3,2" 
      Click="TemplateButton_Click"/> 
</DataTemplate> 

代碼隱藏

private void TemplateButton_Click(object sender, RoutedEventArgs e) 
{ 
    Button clickedButton = sender as Button; 
    ListBoxItem listBoxItem = GetVisualParent<ListBoxItem>(clickedButton); 
    if (listBoxItem != null) 
    { 
     listBoxItem.IsSelected = true; 
    } 
} 

public static T GetVisualParent<T>(object childObject) where T : Visual 
{ 
    DependencyObject child = childObject as DependencyObject; 
    // iteratively traverse the visual tree 
    while ((child != null) && !(child is T)) 
    { 
     child = VisualTreeHelper.GetParent(child); 
    } 
    return child as T; 
} 
+0

謝謝您的回答。明天上班時我必須檢查一下。 – Paul

+0

ToggleButton的建議效果非常好。謝謝! – Paul