0

我在 XAML 中设置DataGrid了两个s(从此处DataGridComboBoxColumn复制):

<DataGrid x:Name="joinGrid" AutoGenerateColumns="False" CanUserAddRows="True">
                <DataGrid.Columns>
                    <DataGridComboBoxColumn>
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemsSource" Value="{Binding Path=TableAColumns}" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
                        <DataGridComboBoxColumn.EditingElementStyle >
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding Path=TableAColumns}" />
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>

                    <DataGridComboBoxColumn>
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemsSource" Value="{Binding Path=TableBColumns}" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
                        <DataGridComboBoxColumn.EditingElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding Path=TableBColumns}" />
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>
                </DataGrid.Columns>
            </DataGrid>

除了少数例外,因为老实说,我不明白丢失的部分应该包含什么。我正在尝试将列绑定到实体类中包含的字符串列表:

class JoinBlockDTO
{
    public List<string> TableAColumns { get; set; }
    public List<string> TableBColumns { get; set; }
}

在我后面的代码中,我设置了网格ItemsSource

DataGrid dg = (DataGrid)GetTemplateChild("joinGrid");

List<JoinBlockDTO> l = new List<JoinBlockDTO>();
List<string> colAList = (from DataRowView row in sourceA
                         select row.Row.Field<string>(0)).ToList();
List<string> colBList = (from DataRowView row in sourceB
                         select row.Row.Field<string>(0)).ToList();

((DataGridComboBoxColumn)dg.Columns[0]).ItemsSource = colAList; //doesn't work without this
((DataGridComboBoxColumn)dg.Columns[1]).ItemsSource = colBList; //doesn't work without this
l.Add (new JoinBlockDTO(){TableAColumns = colAList, TableBColumns = colBList});
dg.ItemsSource = l;

最初,所有这些都会渲染一个包含所有空白单元格的 2 x 2 网格。我单击两次以查看一个下拉列表,其中包含正确绑定的字符串列表。但是,当我从下拉列表中选择一个值并将焦点移到外部时,单元格将留空。有人可以指出应该向 XAML 添加或修改什么吗?有没有更简单的方法来做这个绑定?我已经阅读了许多有关此组合框列绑定的帖子,但无法理解发生了什么。(使用VS2010)

4

3 回答 3

1

没错,我想通了。

使用 SelectedValueBinding={Binding object} 和 SelectedValuePath="" 为我修复了它。

WPF:使用 DataGridComboBoxColumn 进行数据绑定

于 2013-08-15T08:24:39.920 回答
0

这会帮助你

使用“ObservableCollection”列表自动 INotifyPropertyChanged

 <DataGrid x:Name="myDataGridTeacher" 
                  ItemsSource="{Binding ObservableCollectionList}" >

 <DataGridTemplateColumn Width="*" Header="MyHeader"  >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate >

                            <TextBlock Text="{Binding Material_Name.Name}" 
                                  />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox  
                                       ItemsSource="{Binding Material_Name}" 
                                       DisplayMemberPath="Name"

                                />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>

                </DataGridTemplateColumn>

 </DataGrid>

ItemsSource="{Binding Material_Name}" 是“ObservableCollectionList”中的列表

<TextBlock Text="{Binding Material_Name.Name}" 
                                      />
于 2014-12-10T18:58:18.200 回答
0

也许您的 VM 没有实现INotifyPropertyChanged接口。

这是一个例子:

<Window x:Class="wpfProj.MainWindow"
        ...
        d:DataContext="{d:DesignInstance wpfProj:MainViewModel}">

    <Grid >
        <Grid.Resources>
            <wpfProj:BindingProxy x:Key="proxy" Data="{Binding}"/>
        </Grid.Resources>
        <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Persons}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="*"/>
                <DataGridComboBoxColumn Header="Sex" Width="*" ItemsSource="{Binding Source={StaticResource proxy}, Path=Data.SexList}"
                                        SelectedItemBinding="{Binding Path=Sex}"/>
                <DataGridComboBoxColumn Header="Sex" Width="*" ItemsSource="{Binding Source={x:Static wpfProj:DataCollection.Instance}, Path=SexList}"
                                        SelectedItemBinding="{Binding Path=Sex}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

我放置了两个“Sex”列,只是为了展示绑定到源的两种方法。在第一种情况下,SexList 是 ViewModel (DataContext) 的一部分,这就是我使用代理的原因。在第二种情况下,它绑定到单例的属性。

性别属性:

    public string Sex
    {
        get { return _sex; }
        set
        {
            _sex = value;
            OnPropertyChanged("Sex");
        }
    }

还有代理类(我在网上找过,不记得作者页面的链接了)

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

希望能帮助到你。这是我上传的示例。

于 2012-08-22T10:48:38.417 回答