Wpf 将多个列表绑定到特定的datagridcombobox列

Wpf 将多个列表绑定到特定的datagridcombobox列,wpf,list,xaml,binding,datagridcomboboxcolumn,Wpf,List,Xaml,Binding,Datagridcomboboxcolumn,我有一个有两列的数据网格 一个是DataGridText 第二个是DataGridComboBox 当我加载数据时,两列都会被归档,但是当我单击第二列时,我希望有一个组合框,可以从第二个列表中加载数据 清单是这样的 public ObservableCollection PriorityRuleList{get;set;}=new ObservableCollection() .XAML文件如下所示: public class PriorityRule { public Priority

我有一个有两列的数据网格 一个是DataGridText 第二个是DataGridComboBox 当我加载数据时,两列都会被归档,但是当我单击第二列时,我希望有一个组合框,可以从第二个列表中加载数据 清单是这样的

public ObservableCollection PriorityRuleList{get;set;}=new ObservableCollection()

.XAML文件如下所示:

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

}
<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类型),以便从中进行选择


谢谢大家!

看起来您正试图将两种不同类型的源分配给
DataGridComboxColumn.ItemSource
。保持两个源正常,但确保属性
优先级
存在。否则,对
SelectedValuePath
DisplayMemberPath
的评估将失败

创建具有属性
优先级的类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>();
公共类优先级
{
公共int优先级{get;set;}
}
//将默认值分配到此集合中
公共ObservableCollection规则PriorityDefaultList{get;set;}=new ObservableCollection();
在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>();
//将默认值分配到此集合中
公共ObservableCollection规则PriorityDefaultList{get;set;}=new ObservableCollection();

@Ștefan Blaga,这个建议对你有帮助吗?没有,我甚至都没有让它编译。DataGridComboxColumn没有ItemsSource属性。我不能给RulePriorityDefaultList分配默认值,因为我使用这个列表在gridRefer中加载数据。对不起,我错过了代码中句子的结尾。如果我像上面那样做,数据将不会被加载。然后我需要创建带有优先级的默认列表
//assing your default values into this collection
public ObservableCollection<PriorityRule> RulePriorityDefaultList { get; set; } = new ObservableCollection<PriorityRule>();