C# GridView - 具有可为空数据的组合框列
C# GridView - Combobox Column with nullable data
我正在尝试创建一个 RadGridView,它由对 WCF 的调用填充,return 一个包含一些空值的查询。我需要这些值之一,一个描述 'Roles' 的整数,作为唯一可写字段,通过组合框列访问。我需要让组合框在下拉列表中显示相同的 4 个选项,无论该值是否不是,但标有查询结果中 not 的字符串。
所有其他列都是只读的,可以自动生成,但我想根据 'Roles' 字段的值应用一些自定义格式。
我正在调用 WCF 并将 RadGridView.ItemSource 设置为代码隐藏中的结果。
private void ExpandGet(object sender, Telerik.Windows.RadRoutedEventArgs e)
{ GetContent(4, CurrentUser.Id); }
private void GetContent(int libType, int userId)
{
Services.Libraries.Do(d1 => Dispatcher.ExecuteSync(
() =>
{
var res = d1.EndGetRole(d1.BeginGetRole(userId, libType, null, null));
return res;
},
init: () => WaitContent1.IsBusy = true,
result: res =>
{
Content1.ItemsSource = res;
},
finalize: ok1 => WaitContent1.IsBusy = false));
}
我尝试为角色列创建一个单独的列表以用于其 DisplayMember 路径,并将其添加到自动生成的 DataGrid,但它没有添加任何内容并且 return 是一个空白网格。
public class RIdName
{
public int RId { get; set; }
public string RName { get; set; }
}
public List<IdName> RItemsSource;
public void SetGridUp()
{
RItemsSource.Add(new IdName {RId = -1, RName = "None"});
RItemsSource.Add(new IdName {RId = 0, RName = "User"});
RItemsSource.Add(new IdName {RId = 1, RName = "Contributer"});
RItemsSource.Add(new IdName {RId = 2, RName = "Manager"});
GridViewComboBoxColumn column = new GridViewComboBoxColumn();
column.DataMemberBinding = new Binding("Role");
column.DisplayMemberPath = "Rname";
column.Header = "My Column";
column.UniqueName = "MyColumn";
column.ItemsSource = RItemsSource;
Content1.AutoGenerateColumns = false;
Content1.Columns.Add(column);
}
我也尝试通过 XAML 并从那里更改 DisplayMemberPath,但是由于我需要显示的字符串不在原始查询和 ItemSource 中,所以我没有任何设置。在 table 中,我得到了整数值,但在下拉列表中根本没有选择。
<telerik:RadGridView x:Name="Content1"
ItemsSource="{Binding}"
AutoGenerateColumns="False"
CanUserDeleteRows="False"
CanUserInsertRows="False">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding LibraryName}" UniqueName="Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Per}" UniqueName="Per" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding By}" UniqueName="By" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding On}" UniqueName="On" IsReadOnly="True" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Role} DisplayMemberBinding="IdName" UniqueName="Role" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
最后,我需要将此网格用于相同的查询,但用于页面上大约 15 个不同网格中的不同内容类型。理想情况下,我想创建某种模板并重复使用它。
我应该采用什么方法来处理这个组合框列?我尝试使用转换器(它调用 WCF 服务)但我只是取回了整数并且没有下拉选择。我需要该列来显示实际值,并且我希望能够在代码隐藏的某处定义下拉选项。
你已经接近尝试通过 XAML 完成它,这是我经常做的事情。您需要做的是使用 GridViewComboBoxItem 的 ItemsSource 属性 将它绑定到 ViewModel 中的 属性。为此,您需要将对 ViewModel 的引用设置为 StaticResource。
<UserControl.Resources>
<local:MainPageViewModel x:Key="mainPageViewModel" />
</UserControl.Resources>
...
<telerik:GridViewComboBoxColumn Header="Role"
DataMemberBinding="{Binding RID}"
ItemsSource="{Binding Path=RItemSource, Source={StaticResource mainPageViewModel}}"
DisplayMemberPath="RName"
SelectedValueMemberPath="RID" />
如果需要,您可以在此处找到更多信息。
http://docs.telerik.com/devtools/silverlight/controls/radgridview/troubleshooting/blank-cells
我正在尝试创建一个 RadGridView,它由对 WCF 的调用填充,return 一个包含一些空值的查询。我需要这些值之一,一个描述 'Roles' 的整数,作为唯一可写字段,通过组合框列访问。我需要让组合框在下拉列表中显示相同的 4 个选项,无论该值是否不是,但标有查询结果中 not 的字符串。
所有其他列都是只读的,可以自动生成,但我想根据 'Roles' 字段的值应用一些自定义格式。
我正在调用 WCF 并将 RadGridView.ItemSource 设置为代码隐藏中的结果。
private void ExpandGet(object sender, Telerik.Windows.RadRoutedEventArgs e)
{ GetContent(4, CurrentUser.Id); }
private void GetContent(int libType, int userId)
{
Services.Libraries.Do(d1 => Dispatcher.ExecuteSync(
() =>
{
var res = d1.EndGetRole(d1.BeginGetRole(userId, libType, null, null));
return res;
},
init: () => WaitContent1.IsBusy = true,
result: res =>
{
Content1.ItemsSource = res;
},
finalize: ok1 => WaitContent1.IsBusy = false));
}
我尝试为角色列创建一个单独的列表以用于其 DisplayMember 路径,并将其添加到自动生成的 DataGrid,但它没有添加任何内容并且 return 是一个空白网格。
public class RIdName
{
public int RId { get; set; }
public string RName { get; set; }
}
public List<IdName> RItemsSource;
public void SetGridUp()
{
RItemsSource.Add(new IdName {RId = -1, RName = "None"});
RItemsSource.Add(new IdName {RId = 0, RName = "User"});
RItemsSource.Add(new IdName {RId = 1, RName = "Contributer"});
RItemsSource.Add(new IdName {RId = 2, RName = "Manager"});
GridViewComboBoxColumn column = new GridViewComboBoxColumn();
column.DataMemberBinding = new Binding("Role");
column.DisplayMemberPath = "Rname";
column.Header = "My Column";
column.UniqueName = "MyColumn";
column.ItemsSource = RItemsSource;
Content1.AutoGenerateColumns = false;
Content1.Columns.Add(column);
}
我也尝试通过 XAML 并从那里更改 DisplayMemberPath,但是由于我需要显示的字符串不在原始查询和 ItemSource 中,所以我没有任何设置。在 table 中,我得到了整数值,但在下拉列表中根本没有选择。
<telerik:RadGridView x:Name="Content1"
ItemsSource="{Binding}"
AutoGenerateColumns="False"
CanUserDeleteRows="False"
CanUserInsertRows="False">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding LibraryName}" UniqueName="Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Per}" UniqueName="Per" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding By}" UniqueName="By" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding On}" UniqueName="On" IsReadOnly="True" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Role} DisplayMemberBinding="IdName" UniqueName="Role" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
最后,我需要将此网格用于相同的查询,但用于页面上大约 15 个不同网格中的不同内容类型。理想情况下,我想创建某种模板并重复使用它。
我应该采用什么方法来处理这个组合框列?我尝试使用转换器(它调用 WCF 服务)但我只是取回了整数并且没有下拉选择。我需要该列来显示实际值,并且我希望能够在代码隐藏的某处定义下拉选项。
你已经接近尝试通过 XAML 完成它,这是我经常做的事情。您需要做的是使用 GridViewComboBoxItem 的 ItemsSource 属性 将它绑定到 ViewModel 中的 属性。为此,您需要将对 ViewModel 的引用设置为 StaticResource。
<UserControl.Resources>
<local:MainPageViewModel x:Key="mainPageViewModel" />
</UserControl.Resources>
...
<telerik:GridViewComboBoxColumn Header="Role"
DataMemberBinding="{Binding RID}"
ItemsSource="{Binding Path=RItemSource, Source={StaticResource mainPageViewModel}}"
DisplayMemberPath="RName"
SelectedValueMemberPath="RID" />
如果需要,您可以在此处找到更多信息。 http://docs.telerik.com/devtools/silverlight/controls/radgridview/troubleshooting/blank-cells