【问题标题】:Binding multiple lists to as specific datagridcombobox column将多个列表绑定到特定的 datagridcombobox 列
【发布时间】:2018-08-16 15:40:16
【问题描述】:

我有一个包含 2 列的数据网格 一个是 DataGridText 第二个是 DataGridComboBox 当我加载数据时,两列都被归档,但是当我点击第二个时,我想要一个组合框来加载第二个列表中的数据 所以列表是这样的

public ObservableCollection PriorityRuleList { get;放; } = 新的 ObservableCollection();

public ObservableCollection<int> RulePriorityDefaultList { get; set; } = new ObservableCollection<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };

PriorityRule 类是这样的:

public class PriorityRule
{
    public PriorityRule(RecipientSource recipientSource)
    {
        RuleType = recipientSource.Name;
        Priority = recipientSource.Priority;
    }
    public PriorityRule() { }
    public string RuleType { get; set; }
    public int Priority { get; set; }
    public RecipientSource RecipientSource { get; set; }

}

.XAML 文件是这样的:

<DataGrid
                    x:Name="PriorityRulesGrid"
                        HorizontalAlignment="Stretch"
                    VerticalAlignment="Top"
                    AutoGenerateColumns="false"
                    CanUserAddRows="False"
                    GridLinesVisibility="All"
                    HorizontalScrollBarVisibility="Auto"
                    IsReadOnly="False"
                    RowHeight="32"
                    VerticalScrollBarVisibility="Auto"
                    HorizontalContentAlignment="Stretch" 
                    ItemsSource="{Binding PriorityRuleList}"
                    ColumnWidth="*" >
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="{texts:VRI Rule type}"  
                                                    Binding="{Binding RuleType}"
                                                    IsReadOnly="True"
                                                    Width="*"/>
                                <DataGridComboBoxColumn Header="{texts:VRI Priority}" 
                                                        Width="*"
                                    SelectedValuePath="Priority"
                                    SelectedValueBinding="{Binding Priority}"
                                    DisplayMemberPath="Priority">

                                    <DataGridComboBoxColumn.ElementStyle>
                                    <Style TargetType="{x:Type ComboBox}">
                                            <Setter Property="ItemsSource" Value="{Binding Path=DataContext.PriorityRuleList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                                        </Style>
                                </DataGridComboBoxColumn.ElementStyle>
                                <DataGridComboBoxColumn.EditingElementStyle>
                                    <Style TargetType="ComboBox">
                                            <Setter Property="ItemsSource" Value="{Binding Path=DataContext.RulePriorityDefaultList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                                    </Style>
                                </DataGridComboBoxColumn.EditingElementStyle>
                                    </DataGridComboBoxColumn>
                            </DataGrid.Columns>    
                   </DataGrid>

我的问题是: 单击第二列中的组合框时,我应该如何加载第二个列表。第一个列表在窗口出现时加载,所以没关系,但是我需要从组合框中选择优先级,所以我无法加载第二个列表(int类型)以便从中选择?

谢谢!

【问题讨论】:

    标签: wpf list xaml binding datagridcomboboxcolumn


    【解决方案1】:

    看起来您正试图将两种不同类型的源分配给DataGridComboBoxColumn.ItemSource。保持两个来源没问题,但确保属性Priority 存在。否则,SelectedValuePath 和 DisplayMemberPath 的评估将失败。

    使用属性Priority 创建一个类 PriorityX

    public class PriorityX
            {
                public int Priority { get; set; }
    
            }
    
        // assing your default values into this collection
        public ObservableCollection<PriorityX> RulePriorityDefaultList { get; set; } = new ObservableCollection<PriorityX>();
    

    在 XAML 中

    <Window.Resources>
        <!--load RulePriorityDefaultList as a static resource-->
        <CollectionViewSource x:Key="RulePriorityDefaultList" Source="{Binding RulePriorityDefaultList}" />
    </Window.Resources>
    
    <Grid>
        <DataGrid
                    x:Name="PriorityRulesGrid"
                    HorizontalAlignment="Stretch"
                    VerticalAlignment="Top"
                    AutoGenerateColumns="false"
                    CanUserAddRows="False"
                    GridLinesVisibility="All"
                    HorizontalScrollBarVisibility="Auto"
                    IsReadOnly="False"
                    RowHeight="32"
                    VerticalScrollBarVisibility="Auto"
                    HorizontalContentAlignment="Stretch"
                    ItemsSource="{Binding PriorityRuleList}"
                    ColumnWidth="*">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Rule type"
                                                    Binding="{Binding RuleType}"
                                                    IsReadOnly="True"
                                                    Width="*" />
                <DataGridComboBoxColumn Header="Priority"
                                   Width="*"
                                   SelectedValuePath="Priority"
                                   SelectedValueBinding="{Binding Priority}"
                                   DisplayMemberPath="Priority"
                                   ItemsSource="{Binding Source={StaticResource RulePriorityDefaultList }}">
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    你也可以使用你现有的课程。

    //assing your default values into this collection
    public ObservableCollection<PriorityRule> RulePriorityDefaultList { get; set; } = new ObservableCollection<PriorityRule>();
    

    【讨论】:

    • @Ștefan Blaga,这个建议对你有帮助吗?
    • 不,我什至没有编译它。 DataGridComboBoxColumn 没有 ItemsSource 属性。而且我无法为 RulePriorityDefaultList 分配默认值,因为使用此列表我将数据加载到网格中
    • 参考这里,link
    • 对不起,我在代码中错过了句子的结尾。如果我像上面那样做,数据将不会被加载。然后我需要创建具有优先级的默认列表
    猜你喜欢
    • 2011-03-16
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多