Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以立即公开DataGridComboxColumn?_C#_.net 3.5_Wpfdatagrid_Wpftoolkit_Datagridcomboboxcolumn - Fatal编程技术网

C# 是否可以立即公开DataGridComboxColumn?

C# 是否可以立即公开DataGridComboxColumn?,c#,.net-3.5,wpfdatagrid,wpftoolkit,datagridcomboboxcolumn,C#,.net 3.5,Wpfdatagrid,Wpftoolkit,Datagridcomboboxcolumn,当数据网格加载时,WPF Toolkit数据网格的DataGridComboxColumn是否可能“公开”?默认情况下,您必须在单元格中单击以显示组合框。我想让用户看到组合框是可用的,而不必在单元格中单击。我希望组合框立即可用,并且第一次单击单元格会使组合框实际下拉。当前,您必须单击单元格,然后单击组合框下拉列表以显示值 V.S XAML: 代码隐藏: List<string> _statusList; public List<string> StatusList

当数据网格加载时,WPF Toolkit数据网格的DataGridComboxColumn是否可能“公开”?默认情况下,您必须在单元格中单击以显示组合框。我想让用户看到组合框是可用的,而不必在单元格中单击。我希望组合框立即可用,并且第一次单击单元格会使组合框实际下拉。当前,您必须单击单元格,然后单击组合框下拉列表以显示值

V.S

XAML:


代码隐藏:

List<string> _statusList;
public List<string> StatusList
{
  get 
  {
      return _statusList; 
  }
  set
  {
    _statusList = value;
    ctrlStatus.ItemsSource = _statusList;
  }
}
List<string> _statusList;
public List<string> StatusList 
{
  get { return _statusList;  }
  set { _statusList = value; }
}
List\u statusList;
公共列表状态列表
{
得到
{
返回状态列表;
}
设置
{
_状态列表=值;
ctrlStatus.ItemsSource=\u statusList;
}
}
谢谢,GAR8

最终解决方案: XAML


代码隐藏:

List<string> _statusList;
public List<string> StatusList
{
  get 
  {
      return _statusList; 
  }
  set
  {
    _statusList = value;
    ctrlStatus.ItemsSource = _statusList;
  }
}
List<string> _statusList;
public List<string> StatusList 
{
  get { return _statusList;  }
  set { _statusList = value; }
}
List\u statusList;
公共列表状态列表
{
获取{return\u statusList;}
设置{u statusList=value;}
}
您可以使用并放置组合框作为单元格编辑模板,而无需指定非编辑模板。这将使DataGrid始终使用ComboBox

更新
根据您评论中的要求,下面是一个示例。请注意,这个例子并不是最优的,我会选择另一个设计,但我的设计方式应该使它能够集成到您的解决方案中,而不会出现更大的问题。我还没有测试过。如果它们在中有错误,请发表评论

<DataGridTemplateColumn>    
     <DataGridTemplateColumn.CellEditingTemplate >       
           <DataTemplate>         
                 <ComboBox x:Name="ctrlStatus" 
                        SelectedValueBinding="{Binding Port}" 
                        SelectedValuePath="Status">  
                        SelectionChanged="SelectionChanged"
                        ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" 
                  />       
           </DataTemplate>    
     </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

SelectionChanged=“SelectionChanged”
ItemsSource=“{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}”
/>       
要使用上述代码,StatusList必须实现更改通知。如果您的DataGrid不在aWindow中,而是在另一个类(如UserControl)中,请替换相对源中的类型名称。

尝试此操作

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
           <ComboBox ItemsSource=”{Binding Path=YourSource...}” 
         Text=”{Binding Path=YourSource...}”/>
       </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
       <DataGridTemplateColumn.CellEditingTemplate >
       <DataTemplate>
         <ComboBox ItemsSource=”{Binding Path=YourSource...}” 
         Text=”{Binding Path=YourSource...}”/>
       </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

基本上,您可以在CellTemplate和CellEditingTemplate这两种情况下定义组合框


请看我不久前写的这篇文章,我为单元格的非编辑(您最初看到的)和编辑(您单击组合框时看到的)状态编写了单独的模板。现在,您可以像我在上述XAML中所做的那样,在非编辑模式下复制编辑代码,您的问题将得到解决

如果您需要经常使用此功能,则可以定义自定义列:

public class DataGridCustomComboBoxColumn : DataGridComboBoxColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        return base.GenerateEditingElement(cell, dataItem);
    }
}

然后可以使用它来代替正常的
datagridcomboxcolumn

我尝试过这样做,但后来我丢失了用于绑定的控件的x:Name引用。您有允许更改绑定和选择的示例吗。我在问题中添加了我的代码。@GAR8:我扩展了我的答案。这种方法的问题是它失去了绑定,因为x:Name=“ctrlStatus”在后面的代码中不可见。@GAR8:很好,这很有意义。我从来没有这样用过。在绑定上声明ItemsSource(可能是在ContainerControl的相对资源上,我假设它是UserControl或Window)。不要忘记为StatusList属性实现INotifyPropertyChanged。绑定看起来像这样:ItemsSource=“{binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}”。如果是在用户控件中,请通过“UserControl”替换“Window”。谢谢,我发现单独使用CellTemplate和您的RelativeSource绑定方法解决了这个问题。仅仅使用CellEditingTemplate是行不通的,它在运行时不会以组合框的形式出现。我已经用状态组合框的完整xaml更新了原始问题。我喜欢这种方法,但是绑定对我来说仍然是个问题。我没有使用MVVM。您能用这种方法帮助绑定吗?请参阅我更新的原始文章,其中显示了我的XAML和代码。我通过x:Name“ctrlStatus”绑定到状态组合框。在代码后面有一个
公共属性状态列表
对吗?您已经绑定了
SelectedValueBinding
SelectedValuePath
,这意味着您正在设置一些
DataContext
。现在只需执行