WPF Datagrid : DataGridcomboxbox 항목 컬렉션에 바인딩
-
06-07-2019 - |
문제
상황:
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;
}
결과 :
다른 팁
실수는 당신이 당신의 구속력을 행한 방법이라고 생각합니다. 열을 정의 할 때 바인딩은 특정 행으로 표시되는 객체와 관련이 있습니다. 내가 이해 한대로 각 행에 대한 통계가 있으므로 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가 제안한대로 바인딩을 고정 한 후 정확히 어디에 갇힌 지 지적하는 것이 좋습니다.