0

再会。有一个DataGrid (operationGrid) RowDetailsTemplate,其中包含DataGrid (sumOperationGrid)

            <DataGrid AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" IsReadOnly="True" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=OperCountUnits}" Name="operationGrid" RowDetailsVisibilityMode="VisibleWhenSelected" SelectionMode="Single" VerticalContentAlignment="Bottom" Grid.ColumnSpan="2" Margin="6,60,7,6" LoadingRowDetails="operationGrid_LoadingRowDetails" SelectionChanged="operationGrid_SelectionChanged">
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="Id" Binding="{Binding Path=Id}" Header="{Binding NumberOfOperation, Source={StaticResource resources}}" IsReadOnly="True" />
                    <DataGridTextColumn x:Name="StartedAt" Binding="{Binding Path=StartedAt, Converter={StaticResource ConvertCultureDate}}" Header="{Binding StartedAt, Source={StaticResource resources}}" IsReadOnly="True" />
                    <DataGridTextColumn x:Name="FinisedAt" Binding="{Binding Path=FinishedAt, Converter={StaticResource ConvertCultureDate}}" Header="{Binding FinishedAt, Source={StaticResource resources}}" IsReadOnly="True" />
                    <DataGridTextColumn x:Name="CountMode" Binding="{Binding Path=Description}" Header="{Binding CountMode, Source={StaticResource resources}}" IsReadOnly="True" />
                    <DataGridTextColumn x:Name="CurrencyCode" Header="{Binding CurrcencyCode, Source={StaticResource resources}}" IsReadOnly="True" />
                    <DataGridTextColumn x:Name="UnitId" Binding="{Binding Path=UnitId}" Header="UnitId" IsReadOnly="True" Visibility="Collapsed" />
                    <DataGridTextColumn x:Name="CountModeId" Binding="{Binding Path=CountModeId}" Header="CountModeId" IsReadOnly="True" Visibility="Collapsed" />
                    <DataGridTextColumn x:Name="HotListCount" Binding="{Binding Path=HotListCount}" Header="Фальш" IsReadOnly="True" Visibility="Collapsed" />
             </DataGrid.Columns>
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding CurrencySum}" Name="sumOperationGrid" SelectionChanged="sumOperationGrid_SelectionChanged" SelectionMode="Single">
                            <DataGrid.Columns>
                                <DataGridTextColumn Binding="{Binding csId}" Visibility="Collapsed" />
                                <DataGridTextColumn Binding="{Binding CurrId}" Visibility="Collapsed" />
                                <DataGridTextColumn Binding="{Binding Curr}" Header="{Binding Currency, Source={StaticResource resources}}" />
                                <DataGridTextColumn Binding="{Binding TotalSum, Converter={StaticResource replaceNull}}" Header="{Binding Sum, Source={StaticResource resources}}" />
                          </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid> 

该请求是针对 WCF 服务的,结果证明一切都很好 如果您通过委托提交数据,那么答案就在数据网格 (sumOperationGrid) 中并显示出来。

  private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum );
   private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
    {
        OperCountUnit _con = (OperCountUnit)e.Row.DataContext;
        DataGrid s2 = e.DetailsElement.FindName("sumOperationGrid") as DataGrid;
        client.BeginGetCurrencySumByCurrentItem((int)_con.Id,
            new AsyncCallback(
            delegate(IAsyncResult result)
            {
                List<CurrencySum> sum = client.EndGetCurrencySumByCurrentItem(result).ToList<CurrencySum>();
                if (sum != null)
                {
                    s2.Dispatcher.BeginInvoke(new CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke), new object[2] {s2, sum});
                }
            }
           ), null);
      }

    void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid, List<CurrencySum> sum)
    {
        sumGrid.ItemsSource = sum;
    } 

试过了。

private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
OperCountUnit _con = (OperCountUnit)e.Row.DataContext;
 DataGrid s2 = e.DetailsElement.FindName("sumOperationGrid") as DataGrid;
client.BeginGetCurrencySumByCurrentitem((int)_con.Id, new AsyncCallback        (GetCurrencySumByCurrentItemCallBack), null);
}

private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum );
private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result)
{
DataGridRow opGrRow = (DataGridRow)(this.operationGrid.ItemContainergenerator.containerfromitem        (this.operationGrid.Items.Currentitem));
 ContentPresenter cpOpGrRow = FindVisualChild<ContentPresenter>(opGrRow);
DataTemplate dtOpGrRow = cpOpGrRow.ContentTemplate;
DataGrid s2 = (DataGrid)dtOpGrRow.FindName("sumOperationGrid", cpOpGrRow);

}

void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid, List<CurrencySum> sum)
{
sumGrid.ItemsSource = sum;
}

private childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
} 

所以

private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
OperCountUnit _con = (OperCountUnit)e.Row.DataContext;
DataGrid s2 = e.DetailsElement.FindName("sumOperationGrid") as DataGrid;
client.BeginGetCurrencySumByCurrentitem((int)_con.Id, new AsyncCallback    (GetCurrencySumByCurrentItemCallBack), s2);
}

private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum );
private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result)
{
DataGrid s2 = result.AsyncState as DataGrid
List<CurrencySum> sum = client.EndGetCurrencySumByCurrentitem(result).ToList<CurrencySum>();
if (sum != null)
{
s2.Dispatcher.BeginInvoke(new CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke),     new object[2] {s2, sum});
}


}

void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid, List<CurrencySum> sum)
{
sumGrid.ItemsSource = sum;
}

在这两种情况下,都归结为错误“调用线程无法访问此对象,因为此对象的所有者是另一个线程。”

如何从 client.BeginGetCurrencySumByCurrentitem 中删除委托并在单独的函数中转发数据表 s2 的问题?如何回到您的流程并将数据加载到表 sumOperationGrid 中?

4

2 回答 2

0

如果我理解凌乱的代码,我将无法理解您为什么要到处通过数据网格。仅通过传递 sum 尝试访问网格并在操作结束时设置 ItemsSource。这是回调函数的伪代码:

private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result)
{
   if(sum != null)
   {
      this.Invoke(new Action(()=>
       {
          //get data grid 
          //set ItemSource
       })
   }
}

或者,如果您确实需要数据网格来调用,请尝试执行以下操作:

DataGrid myDataGrid;
private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
    OperCountUnit _con = (OperCountUnit)e.Row.DataContext;
    myDataGrid = e.DetailsElement.FindName("sumOperationGrid") as DataGrid;
    //do stuff without passing grid
}

private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result)
{
    List<CurrencySum> sum = client.EndGetCurrencySumByCurrentitem(result).ToList<CurrencySum>();
    if (sum != null)
    {
        myDataGrid.Dispatcher.BeginInvoke(new Action(()=>
         {
             myDataGrid.ItemSource = sum;
         });
}
于 2014-10-29T15:51:56.070 回答
0

是的。这是个好主意。非常感谢!

private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result)
{
   if(sum != null)
   {
      this.Invoke(new Action(()=>
       {
          //get data grid 
          //set ItemSource
       })
   }
}

我改变了我的代码

    private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
    {
        OperCountUnit _con = (OperCountUnit)e.Row.DataContext;
        client.BeginGetCurrencySumByCurrentItem((int)_con.Id, new AsyncCallback(GetCurrencySumByCurrentItemCallBack), null);
    }        

    private delegate void CurrencySumByCurrentItemInvoke(List<CurrencySum> sum);
    private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result)
    {
        List<CurrencySum> sum = client.EndGetCurrencySumByCurrentItem(result).ToList<CurrencySum>();
        if (sum != null)
        {
            Dispatcher.Invoke(new CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke), new object[1] { sum });
        }        
    }

    void GetCurrencySumByCurrentItemInvoke(List<CurrencySum> sum)
    {
        DataGridRow opGrRow = (DataGridRow)(this.operationGrid.ItemContainerGenerator.ContainerFromItem(this.operationGrid.SelectedItem));
        DataGridDetailsPresenter cpOpGrRow = FindVisualChild<DataGridDetailsPresenter>(opGrRow);
        DataTemplate dtOpGrRow = cpOpGrRow.ContentTemplate;
        DataGrid s2 = (DataGrid)dtOpGrRow.FindName("sumOperationGrid", cpOpGrRow);
        s2.ItemsSource = sum;
    }
于 2014-10-29T17:15:31.097 回答