C#GridView-具有可为空数据的组合框列

C#GridView-具有可为空数据的组合框列,c#,silverlight,gridview,combobox,radgridview,C#,Silverlight,Gridview,Combobox,Radgridview,我试图创建一个RadGridView,该视图由对WCF的调用填充,该调用返回一个包含一些空值的查询。我需要这些值中的一个,一个描述“角色”的整数,作为唯一可写字段,通过combobox列访问。我需要让组合框在下拉列表中显示相同的4个选项,不管值是否为,但标记为不在查询结果中的字符串 所有其他列都是只读的,可以自动生成,但我想根据“角色”字段的值应用一些自定义格式 我正在进行WCF调用,并将RadGridView.ItemSource设置为代码隐藏中的结果 private void ExpandG

我试图创建一个RadGridView,该视图由对WCF的调用填充,该调用返回一个包含一些空值的查询。我需要这些值中的一个,一个描述“角色”的整数,作为唯一可写字段,通过combobox列访问。我需要让组合框在下拉列表中显示相同的4个选项,不管值是否为,但标记为不在查询结果中的字符串

所有其他列都是只读的,可以自动生成,但我想根据“角色”字段的值应用一些自定义格式

我正在进行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));
}
我尝试为Roles列创建一个单独的列表,用于显示成员路径,并将其添加到自动生成的DataGrid中,但它没有添加任何内容并返回一个空白网格

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);
    }
公共类名称
{
公共int RId{get;set;}
公共字符串RName{get;set;}
}                       
公共列表源;
public void SetGridUp()
{
Add(新的IdName{RId=-1,RName=“None”});
添加(新的IdName{RId=0,RName=“User”});
Add(新的IdName{RId=1,RName=“Contributer”});
Add(新的IdName{RId=2,RName=“Manager”});
GridViewComboBoxColumn=新的GridViewComboxColumn();
column.DataMemberBinding=新绑定(“角色”);
column.DisplayMemberPath=“Rname”;
column.Header=“我的列”;
column.UniqueName=“MyColumn”;
column.ItemsSource=ritemSource;
Content1.AutoGenerateColumns=false;
Content1.Columns.Add(column);
}
我还试图通过XAML来实现这一点,并从此处更改DisplayMemberPath,但由于需要显示的字符串不在原始查询和ItemSource中,因此我没有任何设置。在表中,我得到了整数值,但在下拉列表中没有选择

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


你已经接近通过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" />

...
如果需要,你可以在这里找到更多信息。

我对这件事感到非常失望,所以把它忘了。几个月后我又回来了,这个链接帮我解决了这个问题。我在这些页面上没有使用视图模型,只是使用了传统的代码隐藏,而是在代码隐藏中分配ItemsSource,并将XAML作为
code
ItemsSource=“{Binding}”
code
完成了这一任务。谢谢你,米切尔。