2011-12-26 52 views
0

我有一個似乎沒有被其他類似問題(其中大部分都無法回答)覆蓋的方案。Silverlight 4 - 將DataGrid中的ComboBox綁定到WCF客戶端的屬性合同類

這裏所說:

我有以下項目進行合作:

1)返回超過100性能非常複雜的數據合同的WCF服務。我不想創建這個對象的ViewModel,因爲我不想保留超過100個屬性,除非絕對需要

2)I有一個Silverlight用戶控件,其具有定義爲資源這個數據契約:

<UserControl.Resources> 
    <DieEstimateService:DieEstimateContract x:Key="Die" /> 
</UserControl.Resources> 

3)我有結合稱爲Die.DieMetalforming模具的集合的數據網格。這個集合是一個DieMetalformingContract對象數組。此集合中顯示兩列,即DiePunchFunctionDescription和DiePunchConstructionDescription屬性。 DiePunchFunctionDescription具有一個名爲DiePunchFunctionUID的相應鍵屬性,同樣DiePunchConstructionDescription具有一個名爲DiePunchConstructionUID的關鍵屬性。當網格處於顯示模式時,它使用TextBlocks來顯示DiePunchFunctionDescription和DiePunchConstructionDescription字段。數據網格經由代碼結合到Die.DieMetalforming陣列後面這樣:

dgDieMetalforming.ItemsSource = Die.DieMetalformings; 

4)當電網處於編輯模式時,存在用於DiePunchFunction和DiePunchConstruction列組合框,這兩者都是爲界到Die對象的元數據集合。這些集合被命名爲DiePunchFunctionFields和DiePunchConstructionFields。這兩個集合都是StandardCostFieldContract對象的數組(它們根據字段的類型只有不同的數據)。 StandardCostFieldContract具有「FieldDescription」的顯示屬性和「StandardCostFieldUID」的關鍵屬性。

5)最後,datagrid包含DieMetalformingContract的Quantity屬性的第三列。在正常模式下,這是一個TextBlock,在編輯模式下,這是一個TextBox。該屬性按照預期用於雙向數據綁定。

datagrid正確地綁定到數據源,正如TextBlocks和Quantity字段的TextBox的正確功能所證明的那樣。但是,我無法讓組合框從DiePunchFunctions或DiePunchConstructions數組中加載它們的數據。我已經準備了十幾篇關於這個主題的文章,並嘗試了我可以找到的ItemSources綁定的每一個組合,但似乎沒有任何工作。這裏是我的DataGrid定義:

<sdk:DataGrid AutoGenerateColumns="False" Height="167" HorizontalAlignment="Stretch" Margin="6,255,6,0" 
        Name="dgDieMetalforming" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="4" 
        SelectionMode="Single" TabNavigation="Local"> 
    <sdk:DataGrid.Columns> 
     <sdk:DataGridTemplateColumn CanUserReorder="False" CanUserResize="False" 
      CanUserSort="False" Header="Punch/Die Function" Width="Auto" > 
      <sdk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding DiePunchFunctionDescription}" Margin="4" /> 
       </DataTemplate> 
      </sdk:DataGridTemplateColumn.CellTemplate> 
      <sdk:DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox Name="ddlDiePunchFunction" ItemsSource="{Binding 
        Path=Die.DiePunchFunctionFields, Mode=OneWay}" 
        SelectedItem="{Binding Path=DiePunchFunctionUID, Mode=TwoWay}" 
        DisplayMemberPath="FieldDescription" 
        SelectedValuePath="StandardCostFieldUID" /> 
       </DataTemplate> 
      </sdk:DataGridTemplateColumn.CellEditingTemplate> 
     </sdk:DataGridTemplateColumn> 
     <sdk:DataGridTemplateColumn CanUserReorder="False" CanUserResize="False" 
      CanUserSort="False" Header="Punch/Die Construction" Width="Auto" > 
      <sdk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding DiePunchConstructionDescription}" Margin="4" /> 
       </DataTemplate> 
      </sdk:DataGridTemplateColumn.CellTemplate> 
      <sdk:DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox Name="ddlDiePunchFunction" ItemsSource="{Binding 
        Path=Die.DiePunchConstructionFields, Mode=OneWay}" 
        SelectedItem="{Binding Path=DiePunchConstructionUID, Mode=TwoWay}" 
        DisplayMemberPath="FieldDescription" 
        SelectedValuePath="StandardCostFieldUID" /> 
       </DataTemplate> 
      </sdk:DataGridTemplateColumn.CellEditingTemplate> 
     </sdk:DataGridTemplateColumn> 
     <sdk:DataGridTemplateColumn CanUserReorder="False" CanUserResize="False" 
      CanUserSort="False" Header="Quantity" Width="Auto" > 
      <sdk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Quantity}" Margin="4" /> 
       </DataTemplate> 
      </sdk:DataGridTemplateColumn.CellTemplate> 
      <sdk:DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <TextBox Name="txtQuantity" Text="{Binding Quantity, Mode=TwoWay}" /> 
       </DataTemplate> 
      </sdk:DataGridTemplateColumn.CellEditingTemplate> 
     </sdk:DataGridTemplateColumn> 
    </sdk:DataGrid.Columns> 
</sdk:DataGrid> 

我已經花了太多的時間在這個已經和它達到一個地步,我需要結算有關此問題的任何更多的時間之前返工的整體思路。如果您可以推薦一個將使組合框綁定到其itemsources的行動方案,我將永遠感激。

+0

不能減少你的小說排序嗎? – codeSetter 2011-12-26 19:22:01

+0

對不起,但我不知道如何縮短而不會丟失重要信息。 – 2011-12-26 19:24:13

回答

1

我終於說「SCREW IT」數據綁定,並與codebehind事件綁定組合框。新的網格看起來像這樣(我發佈了問題後添加了一些輔助功能)。

<sdk:DataGrid AutoGenerateColumns="False" Height="167" HorizontalAlignment="Stretch" Margin="6,255,6,0" 
        Name="dgDieMetalforming" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="4" 
        SelectionMode="Single" TabNavigation="Local"> 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridTemplateColumn CanUserReorder="False" CanUserResize="False" 
             CanUserSort="False" Header="Punch/Die Function" Width="Auto" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding DiePunchFunctionDescription}" Margin="4" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox Name="ddlDiePunchFunction" 
            SelectionChanged="ddlDiePunchFunction_SelectionChanged" 
            Loaded="ddlDiePunchFunction_Loaded" 
            SelectedItem="{Binding Path=DiePunchFunctionUID, Mode=TwoWay}" 
            DisplayMemberPath="FieldDescription" 
            SelectedValuePath="StandardCostFieldUID" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn CanUserReorder="False" CanUserResize="False" CanUserSort="False" 
             Header="Punch/Die Construction" Width="Auto" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding DiePunchConstructionDescription}" Margin="4" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox Name="ddlDiePunchConstruction" 
            SelectionChanged="ddlDiePunchConstruction_SelectionChanged" 
            Loaded="ddlDiePunchFunction_Loaded" 
            SelectedItem="{Binding Path=DiePunchConstructionUID, Mode=TwoWay}" 
            DisplayMemberPath="FieldDescription" 
            SelectedValuePath="StandardCostFieldUID" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn CanUserReorder="False" CanUserResize="False" CanUserSort="False" 
             Header="Quantity" Width="Auto" > 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Quantity}" Margin="4" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
       <sdk:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <TextBox Name="txtQuantity" Text="{Binding Quantity, Mode=TwoWay}" /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellEditingTemplate> 
      </sdk:DataGridTemplateColumn> 
      <sdk:DataGridTemplateColumn CanUserReorder="false" CanUserResize="False" CanUserSort="False" 
             Header="" Width="Auto"> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button Name="btnDelete" Click="btnDelete_Click"> 
          <TextBlock>delete</TextBlock></Button> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 

代碼隱藏看起來像這樣。

private void ddlDiePunchFunction_Loaded(object sender, RoutedEventArgs e) 
{ 
    var src = sender as ComboBox; 
    if (src.IsNotNull()) 
    { 
     var data = src.DataContext as DieMetalformingContract; 
     switch (src.Name) 
     { 
      case "ddlDiePunchFunction": 
       src.ItemsSource = Die.DiePunchFunctionFields; 
       src.SelectedValue = data.DiePunchFunctionUID; 
       break; 
      case "ddlDiePunchConstruction": 
       src.ItemsSource = Die.DiePunchConstructionFields; 
       src.SelectedValue = data.DiePunchConstructionUID; 
       break; 
     } 
    } 
} 

private void ddlDiePunchFunction_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var src = sender as ComboBox; 
    if (src.IsNotNull()) 
    { 
     var data = src.DataContext as DieMetalformingContract; 
     data.DiePunchFunctionUID = src.SelectedValue.ToNullableGuid() ?? Guid.Empty; 
     data.DiePunchFunctionDescription = (from x in Die.DiePunchFunctionFields 
              where x.StandardCostFieldUID == data.DiePunchFunctionUID 
              select x.FieldDescription).FirstOrDefault(); 
    } 
} 

private void ddlDiePunchConstruction_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var src = sender as ComboBox; 
    if (src.IsNotNull()) 
    { 
     var data = src.DataContext as DieMetalformingContract; 
     data.DiePunchConstructionUID = src.SelectedValue.ToNullableGuid() ?? Guid.Empty; 
     data.DiePunchConstructionDescription = (from x in Die.DiePunchConstructionFields 
              where x.StandardCostFieldUID == data.DiePunchConstructionUID 
              select x.FieldDescription).FirstOrDefault(); 
    } 
} 

感謝大家誰讀過這個。

相關問題