DataGrid / ListBox中的WPF按钮

时间:2011-01-09 13:29:15

标签: wpf button event-handling

将WPF项目从vs2008转换为vs2010时遇到问题。 我有一个包含ListBox的DataGrid。每个ListBoxItem都有一个Label和一个Button。转换为vs2010后,该按钮不再呈现,但会在应用程序进入视图时立即崩溃。 (即应用程序加载,但是当创建ListBox时,我得到一个NullReferenceException。虽然工作是从按钮中删除click事件然后它渲染得很好:)与ListBoxItem中的Button相同类型的设置也可以在不在里面时工作一个DataGrid。 ListBox的内容显然是动态的,但在使用静态集合时,我得到了同样的错误。同时删除CommandParam也没有任何帮助。任何指针都非常受欢迎。

代码:

<DataGrid x:Name="DgTest" AutoGenerateColumns="false">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <ListBox ItemsSource="{Binding ItemList}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate >
                                        <StackPanel Style="{StaticResource hzp}">
                                            <Label  />
                                            <Button Click="Button_Click"     Content="TestButton"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

代码隐藏:

Imports System.Collections.ObjectModel

Class MainWindow
    Public TestList As New ObservableCollection(Of TestClass)

    Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As     System.Windows.RoutedEventArgs) Handles Me.Loaded
    DgTest.ItemsSource = TestList
    TestList.Add(New TestClass(0))
    TestList.Add(New TestClass(1))
    End Sub

    Public Class TestClass
        Private _ItemList As New List(Of String)
        Private _id As Integer

        Public Property ItemList() As List(Of String)
        Get
            Return _ItemList
        End Get
        Set(ByVal value As List(Of String))
            _ItemList = value
        End Set
    End Property
    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property


    Public Sub New(ByVal id As Integer)
        _ItemList.Add("String1")
        _id = id
    End Sub
End Class

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)

End Sub

结束班

在应用资源中:

<Style TargetType="StackPanel" x:Key="hzp">
        <Setter Property="Orientation" Value="Horizontal"/>
        <Setter Property="Background" Value="Orange"/>
</Style>

现在这是奇怪的事情。如果删除了Stackpanel样式,该按钮将起作用。如果删除按钮的Click事件,它将正常加载。

2 个答案:

答案 0 :(得分:0)

看起来您的事件处理程序已从代码隐藏文件中消失,请先检查一下。评论是否不是这样。

答案 1 :(得分:0)

我相信我找到了自己问题的答案。在绑定到ObservableCollection的ListBox中,所有样式都必须是DynamicResource。使用StaticResource在3.5但不是4中运行良好!花了几个小时随机测试一切来发现这个。案件结案