C# 是否可以立即公开DataGridComboxColumn?
当数据网格加载时,WPF Toolkit数据网格的DataGridComboxColumn是否可能“公开”?默认情况下,您必须在单元格中单击以显示组合框。我想让用户看到组合框是可用的,而不必在单元格中单击。我希望组合框立即可用,并且第一次单击单元格会使组合框实际下拉。当前,您必须单击单元格,然后单击组合框下拉列表以显示值 V.S XAML: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
代码隐藏:
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
。现在只需执行