【问题标题】:System.InvalidOperationException when trying yo access UniformGrid.Children in C#尝试在 C# 中访问 Uniform Grid.Children 时出现 System.InvalidOperationException
【发布时间】:2013-01-05 02:37:24
【问题描述】:

我正在使用绑定填充UniformGrid。源是Square[,]UniformGrid中填充了Button对象。

这是我所做的: Data Binding between a double array and a grid

我在尝试执行此操作时收到 System.InvalidOperationException

private void OnClickButton(object sender, RoutedEventArgs e)
{
    Button b = (Button)sender;
    UniformGrid grid = ItemControlGrid.ItemsPanel.LoadContent() as UniformGrid;
    int rows = grille.Rows;
    int columns = grille.Columns;
    UIElementCollection children = grid.Children; // I get the Exception here
    int index = children.IndexOf(b);
    int row = index / columns;
    int column = index % rows;
}

这是我的 XAML:

<ItemsControl Background="Gray" Margin="0" Width="800" Height="800"  
    x:Name="ItemControlGrid"
    ItemsSource="{Binding MapGrid}"
    ItemTemplateSelector="{StaticResource selector}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid 
                IsItemsHost="true"
                x:Name="My_UniformGrid" Rows="25" Columns="25"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
 </ItemsControl>

为什么我会收到这个Exception

【问题讨论】:

  • 我们需要更多,让孩子们不应该抛出异常。异常消息中有什么内容吗?

标签: c# wpf xaml


【解决方案1】:

将出现异常的行更改为:

ItemCollection children = ItemControlGrid.Items;

其余代码应该可以正常编译。我假设grille 实际上是grid

<ItemsControl Background="Gray" Margin="0" Width="800" Height="800"  
    x:Name="ItemControlGrid">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid IsItemsHost="true" Rows="25" Columns="25"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!-- First two elements are just dummies to test the result-->
    <Control />
    <Image />
    <Button Click="Button_Click_1" />
</ItemsControl>

代码隐藏:

void Button_Click_1(object sender, RoutedEventArgs e)
{
    var b = (Button) sender;
    var grid = ItemControlGrid.ItemsPanel.LoadContent() as UniformGrid;
    var rows = grid.Rows;
    var columns = grid.Columns;
    var children = ItemControlGrid.Items;
    var index = children.IndexOf(b);
    var row = index/columns;
    var column = index%rows;
    //column will be 2
}

【讨论】:

  • 它可以编译,但是当我这样做时 Console.WriteLine(row+","+column)); 我总是得到:0,-1
  • @Pigrou 我在帖子中添加了一个示例。尝试并根据您的要求进行相应的修改。如果可行,请通过评论告诉我。
  • 我得到falsechildren.Contains(b);
  • @Pigrou 恐怕我帮不上什么忙了,因为我粘贴的代码对我有用。
  • 可能是绑定的原因。发件人甚至没有父母。无论如何,谢谢。
猜你喜欢
  • 2011-10-03
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多