문제

상황:

XAML에서 DataGrid를 만들었고 항목 소스는 속성을 포함하는 특정 클래스의 관측형 수집에 적용됩니다. 그런 다음 C#에서 DataGridTextColumn과 DataGridComboBoxColumn을 생성하고이를 관측형 수집 내부의 객체의 속성에 넣었습니다. DataGridComboboxColumn을 간단한 컬렉션에 바인딩 할 수 있지만 내가하고 싶은 것은 문자열 모음 모음에 바인딩하여 각 행마다 Datagrid 내부의 ComboBox마다 다른 문자열 모음이 있습니다. 그렇게하지 못했습니다 ...

의문:

이 유형의 열의 각 행에 대해 다른 문자열 모음을 가질 수 있도록 datagridcombboxcolumn을 어떻게 바인딩 할 수 있습니까?

코드 샘플 :

XAML :

<Window>
  <!-- ... -->
  WPFToolkit:DataGrid
           x:Name="DG_Operations"
           Margin="10,5,10,5" 
           Height="100" 
           HorizontalAlignment="Stretch" 
           FontWeight="Normal" 
           ItemsSource="{Binding Path=OperationsStats}"
           AlternatingRowBackground="{DynamicResource SpecialColor}" 
           HorizontalScrollBarVisibility="Auto" 
           VerticalScrollBarVisibility="Visible" 
           SelectionMode="Extended"
           CanUserAddRows="False" 
           CanUserDeleteRows="False"
           CanUserResizeRows="True" 
           CanUserSortColumns="True"
           AutoGenerateColumns="False" 
           IsReadOnly="False" 
           IsEnabled="True"
           BorderThickness="1,1,1,1" 
           VerticalAlignment="Stretch"/>
  <!-- ... -->
</Window>

씨#:

public class DataModelStatsOperations
{
   public ObservableCollection<IStatsOperation> OperationsStats { get; set; }
}

public interface IStatsOperation
{
   string Operation { get; set; }
   Collection<string> Data{ get; set; }
}

public class StatsOperation : IStatsOperation
{
    public StatsOperation(string operation, Collection<string> data)
    {
        Operation = operation;
        Data = data;
    }
    public string Operation { get; set; }
    public Collection<string> Data{ get; set; }
}

private ObservableCollection<IStatsOperation> dataOperations_ =
        new ObservableCollection<IStatsOperation>();

//...
 Binding items = new Binding();
 PropertyPath path = new PropertyPath("Operation");
 items.Path = path;
 DG_Operations.Columns.Add(new DataGridTextColumn()
 {
     Header = "Operations",
     Width = 133,
     Binding = items
  });
  DG_Operations.Columns.Add(new DataGridComboBoxColumn()
  {
     Header = "Data",
     Width = 190,
     ItemsSource = /*???*/,
     SelectedValueBinding = new Binding("Data"),
     TextBinding = new Binding("Data")
  });
dataOperations_.Add(new StatsOperation(CB_Operation.SelectedItem.ToString(),
                                                           dataCollection));
DG_Operations.DataContext = new DataModelStatsOperations
{
    OperationsStats = dataOperations_
};
//...

모든 도움이 크게 감사드립니다!

메모:

좋아, 그래서 두 첫 번째 답변을 읽은 후 나는 무언가를 발견했다. 내 구속력은 정말 옳지 않습니다! 이제 내가하고 싶은 것은 Andyg가 제안한 것과 비슷한 것입니다.

DG_Operations.Columns.Add(new DataGridComboBoxColumn()
{
    Header = "Data",
    Width = 190,
    ItemsSource = new Binding("Data"), //notice this here does not work (have a look at the following error)
    SelectedValueBinding = new Binding("Operation"),
    TextBinding = new Binding("Operation")
});

오류 : "유형 'System.windows.data.binding'을 'system.collections.ienumerable'으로 암시 적으로 변환 할 수 없습니다."

항목 소스가 어떻게 데이터에 구속 될 수 있습니까?

도움이 되었습니까?

해결책

첫째, 이것은 쉬워야합니다 ... 둘째, 왜 c#에 열을 구축하고 바인딩 하는가? eek.

XAML (게으르기 때문에 일반 그리드를 사용하고 있습니다) :

<ListView Name="MyListView">
    <ListView.View>
        <GridView>

            <GridView.Columns>

                <GridViewColumn DisplayMemberBinding="{Binding Operation}" />

                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Choices}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView.Columns>

        </GridView>
    </ListView.View>
</ListView>

씨#:

void Window1_Loaded(object sender, RoutedEventArgs e)
{
    var dahList = new List<StatsOperation>();

    dahList.Add(new StatsOperation
    {
        Operation = "Op A",
        Choices = new string[] { "One", "Two", "Three" },
    });

    dahList.Add(new StatsOperation
    {
        Operation = "Op B",
        Choices = new string[] { "4", "5", "6" },
    });

    this.MyListView.ItemsSource = dahList;
}

결과 :

동적 콤보 박스 선택이있는 WPF 그리드 http://www.singingeels.com/articles/articles/userimage.aspx?imageid=B1E3F80-C278-4D2B-BCC2-8AD390591200

다른 팁

실수는 당신이 당신의 구속력을 행한 방법이라고 생각합니다. 열을 정의 할 때 바인딩은 특정 행으로 표시되는 객체와 관련이 있습니다. 내가 이해 한대로 각 행에 대한 통계가 있으므로 TextBox 열이 작동하는 방식으로 바인딩되며 ComboBox 열 항목은 컬렉션에 바인딩되어야합니다. 지금은 그것이 Collection<Collection<string>>.

이전에 코드 베어드에서 열을 정의하지 않았으므로 여기 XAML의 예입니다. Comboboxcolumn이 때때로 까다로울 수 있다는 것을 알았으므로 Templatecolumn 또는 Comboboxcolumn을 사용하여 열에 Combobox를 가질 수있는 방법을 보여주었습니다. 나는 내 자신의 코드에서 붙여 넣은 복사하므로 'dg'를 'wpftoolkit'로 바꾸십시오.

<dg:DataGrid
      ...
      ...>
      <dg:DataGrid.Columns>
            <dg:DataGridTextColumn Binding="{Binding Operation}" CanUserReorder="True" CanUserResize="True" Header="Operation" />
            <dg:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" Header="Template Column">
                <dg:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Data}" SelectedItem="{Binding Operation}" />
                    </DataTemplate>
                </dg:DataGridTemplateColumn.CellTemplate>
            </dg:DataGridTemplateColumn>
            <dg:DataGridComboBoxColumn
                Header="ComboBox Column"                                                                                    
                 SelectedValueBinding="{Binding Operation}"                     
                 SelectedItemBinding="{Binding Operation}">
                <dg:DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
                        <Setter Property="ItemsSource" Value="{Binding Data}" />
                    </Style>
                </dg:DataGridComboBoxColumn.ElementStyle>
                <dg:DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Data}" />
                        <Setter Property="IsDropDownOpen" Value="True" />
                    </Style>
                </dg:DataGridComboBoxColumn.EditingElementStyle>
            </dg:DataGridComboBoxColumn>
      </dg:DataGrid.Columns>

</dg:DataGrid>

작업이 선택된 항목이라고 가정하고 데이터는 선택할 항목이며 DataGrid가 StatsOperation 모음에 바인딩된다고 가정합니다. 행운을 빕니다!

ItemsSource 바인딩 오류를 수정하려면 양식을 사용하십시오.

BindingOperations.SetBinding(new DataGridComboBoxColumn(), DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data"));

당신은 분명히 집안화에서 이것을 할 수 없으므로 선언을 조금 옮겨야하지만 업데이트에서 그 오류를 처리해야합니다.

편집하다 미안 해요, 자정에 조금 느립니다 :). 다음은 업데이트 된 답변입니다. Vincent Sibal의 훌륭한 기사처럼 보입니다 WPF DataGrid -DataGridComboBoxColumn V1 소개 귀하의 질문에 답하십시오. 그것을합니까?

부분적 - 나는 당신이 말하는 것에 혼란이 있다고 생각합니다. 콤보 박스가 다른 행에 대해 다른 줄을 보여줄 수 있도록 각 행에 문자열 모음이 필요하다고 말했습니다. 그러나 콤보 상자가 문자열 세트를 표시하려면 줄 당 문자열 모음이 필요하지 않습니다.

이제 행당 문자열 모음이 필요하기 때문에 문자열 모음이 필요하다고 생각할 수 있습니다.

당신의 질문에 대한 나의 이해가 맞습니까? 그렇다면 문자열 모음 모음에 대한 언급이 잘못되었습니다.

실제로 필요한 것은 각 법정에 문자열 모음이 있어야하는 법적 모음의 모음입니다. 이것은 위의 수업에서 보여지는 방식입니다.

진전을 이루기 위해 질문을 편집하고 Andyg가 제안한대로 바인딩을 고정 한 후 정확히 어디에 갇힌 지 지적하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top