- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想解决的问题:当新项目添加到 RadGridView 时,相应地创建新行。我希望这些新行自动展开 RowDetails。
到目前为止我尝试了什么:我尝试从代码隐藏访问 RadGridView 并注册一个监听新项目的事件处理程序。它会将新项目标记为已选中,从而展开 RowDetails(RowDetailsVisibilityMode 为 VisibleWhenSelected)。
我面临的问题:RadGridView 位于另一个控件资源的数据模板内。如果我设置显式 x:Key
对于数据模板,我可以通过代码访问数据模板;但是,如果我只设置 DataType
对于数据模板,资源中的每个字典条目都有一个空值。
问题是,如果我确实设置了显式 x:Key
对于数据模板,我不能再让我的控件根据数据类型动态决定使用哪个数据模板(没有选择数据模板,我只看到一大片空白)。如何获取数据模板内的控件?
这是我的代码:
XAML:
<telerik:RadTabControl x:Name="radTabControl">
<telerik:RadTabControl.Resources>
<DataTemplate x:Key="TabControlTemplate">
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<!-- Wrapper1 (inherits from Wrapper) -->
<DataTemplate DataType="local:Wrapper1Collection">
<telerik:RadGridView ItemsSource="{Binding}">
....
</telerik:RadGridView>
</DataTemplate>
<!-- Wrapper2 (inherits from Wrapper) -->
<DataTemplate DataType="local:Wrapper2Collection">
<telerik:RadGridView ItemsSource="{Binding}">
....
</telerik:RadGridView>
</DataTemplate>
<!-- Fallback to displaying nothing for unknown wrapper types -->
<DataTemplate DataType="local:WrapperCollection" />
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</telerik:RadTabControl.Resources>
<telerik:RadTabItem Content="{Binding Path=Wrappers}"
ContentTemplate="{StaticResource TabControlTemplate}" />
<telerik:RadTabItem Content="{Binding Path=Wrappers}"
ContentTemplate="{StaticResource TabControlTemplate}" />
</telerik:RadTabControl>
C# 代码隐藏:
public ContentUpdateView()
{
InitializeComponent();
DataTemplate tabControlTemplate =
(DataTemplate)(radTabControl.Resources["TabControlTemplate"]);
FrameworkElement radGridViewContentControl =
(FrameworkElement)(tabControlTemplate.LoadContent());
foreach (DictionaryEntry resourceEntry in radGridViewContentControl.Resources)
{
if (resourceEntry.Value != null)
{
DataTemplate radGridViewDataTemplate = (DataTemplate)(resourceEntry.Value);
RadGridView radGridView = (RadGridView)(radGridViewDataTemplate.LoadContent());
radGridView.Items.CollectionChanged += (s, e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (Wrapper wrapper in e.NewItems)
{
radGridView.SelectedItems.Add(wrapper);
}
}
};
}
}
}
请注意 Wrapper
class 是一个抽象类 Wrapper1
和 Wrapper2
继承自 Wrappers
我的 View 模型上的路径是 WrapperCollection
, 这是一个继承自 ObservableCollection<Wrapper>
的抽象类, 和 Wrapper1Collection
和 Wrapper2Collection
继承自。
最佳答案
好的,根据您的意见,我不会回答“如何访问 [...] 资源 [...]?”,而是尝试给出“如何访问自动展开 RadGridView 新添加行的 RowDetails?”。
我为您的 RadGridView
推荐了一个自定义的 Behavior
,它会监听新添加的行并执行 RowDetail 扩展。
<RadGridView>
<Interaction.Behaviors>
<ExpandDetailsOfNewRowsBehavior/>
</Interaction.Behaviors>
</RadGridView>
和代码:
public class ExpandDetailsOfNewRowsBehavior : Behavior<RadGridView>
{
protected override void OnAttached()
{
base.OnAttached();
INotifyCollectionChanged items = AssociatedObject.Items;
items.CollectionChanged += OnItemsChanged;
AssociatedObject.RowLoaded += CheckLoadedRowIfShouldExpand;
}
private void CheckLoadedRowIfShouldExpand()
{
var iterationCopy = m_shouldBeExpanded.ToArray();
foreach(var item in iterationCopy)
{
GridViewRow row = AssociatedObject.GetRowForItem( item );
if ( row != null )
{
row.DetailsVisibility = Visibility.Visible;
m_shouldBeExpanded.Remove(item);
}
}
}
private List<object> m_shouldBeExpanded = new List<object>();
private void OnItemsChanged(object sender, NotifyCollectionChangedEventArgs eventArgs)
{
if (eventArgs.Action == NotifyCollectionChangedAction.Add)
{
foreach (var item in eventArgs.NewItems)
{
GridViewRow row = AssociatedObject.GetRowForItem( item );
if ( row == null )
{
// row is not loaded yet
m_shouldBeExpanded.Add(item);
}
else
{
row.DetailsVisibility = Visibility.Visible;
// see http://docs.telerik.com/devtools/silverlight/
// controls/radgridview/row-details/programming
// "To manually change the visibility of a row - set its
// DetailsVisibility property to either Visibility.Collapsed
// or Visibility.Visible"
}
}
}
}
protected override void OnDetaching()
{
INotifyCollectionChanged items = AssociatedObject.Items;
items.CollectionChanged -= OnItemsChanged;
AssociatedObject.RowLoaded -= CheckLoadedRowIfShouldExpand;
base.OnDetaching();
}
}
关于c# - 自动展开 RadGridView 新增行的 RowDetails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493370/
我试图在 C# 中的 radGridView 中搜索值。我找到了很多解决方案,但出于某种原因,它只在我的 GridView 的第一行中搜索。你可以在这里看到我的代码: private void btn
我正在使用 telerik 的 RadGridView 来实现合并单元格功能。我正在垂直方向合并单元格。相同值的单元格正在合并,但当双击合并的单元格时,这些单元格会分开。 有什么方法可以防止双击时取消
如何将网格列设置为在启动时排序?我似乎无法在 RadGridView 上找到一个属性来告诉它我希望第一列在启动时按降序排列。网格只是没有排序。 最佳答案 您也可以声明式地执行此操作:
我正在使用 RadGridView 在网格中显示一堆项目。对于每个项目,我想根据给定的数据在两个不同的模板之间切换。一个是本质上弹出文本 block 的依赖属性,另一个是另一个用于显示表格的 RadG
我有一个简单的 RadGridView,我想在其中更改特定行(= 3 个单元格)的文本颜色。不幸的是,这段代码不起作用: //add new row to the grid EventLogGrid.
当我组为默认时 radgridview by Telerik 列的名称和单元格的值都像Group的标题一样放 {Column Title}: {Cell Value} 但我需要将其更改为只有 {Cel
假设我有 class Person { public int Id {get;set;} public string Name {get;set;} public List A
所以我有一个动态的 RadGridView。这意味着我以编程方式将列添加到控件中。基本上是这样的: for (int i = 0; i < length; i++) { Binding b =
我正在使用 RadGridView 来显示正在出售的商品。在同一行我还有一个“数量”、“单价”、“总价”列。 当用户更改“数量”列的值时,我想触发一个事件,通过将“数量”乘以“商品价格”来计算“总价”
我有一个 RadGridView 绑定(bind)到 TestType 的 ObservableCollection。 TestType 包含 3 个成员: string TestString; In
我正在使用 Telerik 控件创建 WPF 项目。我需要创建一个 GridView 来显示一些数据,只有列标题应该是不同的颜色。我有这个但不起作用:
我有一个 RadGridView,我想阻止用户在 fifth 列中写入除 'c' 或 'd' 以外的任何字符、数字或字母。我试过下面的代码,但没有用... private void radGridVi
我在 Win 窗体中使用 Telerik 工具 我无法在 rad 文本框中获取列的总和 知道如何在普通 GridView 中做任何建议吗? int sum = 0; for (int i =
我使用的是 telerik RadGridView,它与 WPF 中的普通 DataGrid 几乎相同。在我的 gridview.columns 中,我有一个 GridViewDataColumn,它
我已经正确绑定(bind)了 Telerik RadGridView,第一列是绑定(bind)复选框: 我可以单击并更改复选框状态没问题。问题是检查复选框并不直观。为了让用户单击复选框,他们必须首先
我有一个我正在设计的应用程序,它的默认大小是 1440x900。如果应用程序的大小调整得比这小,我希望用户能够上下滚动。 我尝试在应用程序的主网格控件周围包裹一个 ScrollView 控件,它似乎可
我有一个 radGridView,用户插入行,我想突出显示具有空值的单元格。例如,使单元格的背景颜色为红色。我试过下面的代码,但没有用... 在按钮内 for (int j = 0; j < radG
我想解决的问题:当新项目添加到 RadGridView 时,相应地创建新行。我希望这些新行自动展开 RowDetails。 到目前为止我尝试了什么:我尝试从代码隐藏访问 RadGridView 并注册
我正在尝试遍历我的 RadGridView 行,但是当我有超过 20 或 30 个项目时,循环不会获取所有行。 例如:在具有 5 个项目的 radgridview 中使用此代码,我可以获取所有项目并做
我正在开发一个小型 C#(WPF + SQLite)应用程序,我在其中实现来自 Telerik 的 RadGridView。我想合并表中具有相同 ID 的所有列。现在我的数据看起来像这样(这是我的观点
我是一名优秀的程序员,十分优秀!