2011-12-26 7 views
0

他の同様の質問ではカバーされていないようなシナリオがあります(そのほとんどは未対応です)。Silverlight 4 - DataGridのComboBoxをWCFのクライアント契約クラスのプロパティにバインドする

はここに行く:

私はで動作するように、以下の項目があります。

1)100以上のプロパティを持つ、非常に複雑なデータコントラクトを返すWCFサービス。私はこのオブジェクトのViewModelを作成したくないので、絶対に必要でない限り、を100以上のプロパティを維持する必要はありません。

2)私は、リソースとして定義され、このデータコントラクトを持つSilverlightのユーザーコントロールを持っている:

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

3)I持ってDie.DieMetalformingと呼ばれるダイのコレクションに結合するデータグリッド。このコレクションは、DieMetalformingContractオブジェクトの配列です。このコレクションから表示する列は、DiePunchFunctionDescriptionプロパティとDiePunchConstructionDescriptionプロパティの2つです。 DiePunchFunctionDescriptionにはDiePunchFunctionUIDという対応するキープロパティがあり、同様にDiePunchConstructionDescriptionにはDiePunchConstructionUIDというキープロパティがあります。グリッドが表示モードのとき、TextBlocksを使用してDiePunchFunctionDescriptionフィールドとDiePunchConstructionDescriptionフィールドを表示します。データグリッドは、次のようなコードビハインド介しDie.DieMetalformingアレイに結合されている:

dgDieMetalforming.ItemsSource = Die.DieMetalformings; 

4)グリッドが編集モードである場合、拘束されることになっているどちらもDiePunchFunctionとDiePunchConstruction列のコンボボックスがありますDieオブジェクトからのメタデータのコレクションに渡します。これらのコレクションはDiePunchFunctionFieldsとDiePunchConstructionFieldsという名前です。どちらのコレクションもStandardCostFieldContractオブジェクトの配列です(フィールドの型に基づいて異なるデータを持つだけです)。 StandardCostFieldContractの表示プロパティは "FieldDescription"で、キープロパティは "StandardCostFieldUID"です。

5)最後に、データグリッドにはDieMetalformingContractのQuantityプロパティの3番目の列が含まれています。ノーマルモードではTextBlockであり、編集モードではTextBoxです。このプロパティは、双方向データバインディングの目的で動作しています。

DataGridは、TextBlocksの正確な機能とQuantityフィールドのTextBoxで示されるように、データソースに正しくバインドされます。しかし、私は、データをDiePunchFunctionsまたはDiePunchConstructions配列からロードするコンボボックスを取得できません。私はこのテーマに関する12の記事を準備しており、見つけられたItemSourcesバインディングのすべての順列を試しましたが、何も動作していないようです。ここに私のデータグリッドの定義です:私はすでにこの上であまりにも多くの時間を費やしてきた

<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> 

、それは私がこの問題上の任意のより多くの時間のために課金する前に全体的なアイデアを手直しする必要がある点に達しています。コンボボックスをアイテムソースに結びつけるような行動を推薦できるなら、私は永遠に感謝しています。

+0

あなたの小説を並べ替えることはできませんか? – codeSetter

+0

申し訳ありませんが、重要な情報を失うことなく短くする方法はわかりません。 –

答えて

1

私は最終的にデータバインディングに「SCREW IT」と言い、コードビヘイドイベントとともにコンボボックスをバインドしました。新しいグリッドは次のようになります(私は質問を投稿してから補助的な機能を追加しました)。

<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(); 
    } 
} 

これを読んだ皆様に感謝します。

関連する問題