2011-08-29 139 views
1

我遇到了困难的绑定情况。我正在使用Telerik RadGridView和GridViewComboBoxColumn。我有两个组合框“发件人”和“收件人”分开登录List<int>。当用户放开From组合框时,所呈现的值应反映“可用”整数范围。可用整数由当前行的From和To范围中的整数范围减去其他行中的范围组成。困难telerik:RadCombobox ItemsSource绑定

我遇到的问题是From组合框是一个绑定List<int>,当我创建可用的整数列表时,它将删除在所有其他非选定行中找到的整数范围。例如,如果我有List<int> 1-48,第一行的范围是25-36,第二行的范围是37-42。当用户在第一行打开“发件人”组合框时,会显示列表1-36和43-48。范围37-42不可用,因为它在第二行使用。

行1 从= 25要= 36 行2 从= 37要= 42

这是问题: 由于绑定列表中不包含的整数37-42会发生什么是第二行的选定项目在列表中不再可用,并且不会显示在网格中。 第2行的来自组合框应在行1的来自组合框关闭后显示'37'。我需要一种方法来记住未选定的行的值,并在From组合框中显示这些值,即使它们未在绑定列表中找到。

FYI:我不关心这里组合框,它很可能为FROM也可以应用到组合框的任何解决方案。

我知道这是混淆,请问如果你有问题。基本上我需要一种方法来保留选定项目的非选定行,当这些项目不再出现在绑定列表中时。我只需要显示原始选定的值。第二行组合框中的项目在打开下拉菜单之前并不重要。然后,这种情况反转,我需要能够调出第一行的选定项目。

telerik:GridViewComboBoxColumn x:Name="cboFrom2" Header="From" Width="Auto" 
IsFilterable="False" IsGroupable="False" IsReorderable="False" IsSortable="False" 
DataMemberBinding="{Binding StrandFrom}" EditTriggers="CellClick" > 
     <telerik:GridViewComboBoxColumn.EditorStyle> 
     <Style TargetType="telerik:RadComboBox"> 
      <Setter Property="OpenDropDownOnFocus" Value="True"/> 
     </Style> 
     </telerik:GridViewComboBoxColumn.EditorStyle> 
    </telerik:GridViewComboBoxColumn> 

回答

1

如果我理解正确,那么使用多转换器如何将可用选项列表与所选选项结合使用?

在你ViewModel,保持可用选项的ObservableCollection。这是您的数据项目未使用的任何号码。每当数据项目的ToFrom属性发生更改时,请更改可用选项列表。

那么你的组合框绑定到可用选项的该列表,并使用多转换器到当前选择的项目添加到的ItemsSource

下面是一些粗糙的伪代码。我没有通过编译器或任何东西运行它,但它应该给你的一般想法。

视图模型

public ObservableCollection<int> AvailableNumbers; 
public ObservableCollection<MyClass> DataObjects; 

foreach(var obj in DataObjects) 
{ 
    obj.PropertyChanged += DataObject_PropertyChanged; 
} 

void DataObject_PropertyChanged(src as object, e as PropertyChangedEventArgs) 
{ 
    if (e.PropertyName == "To" || e.PropertyName == "From") 
     // Adjust AvailableNumbers list 
} 

XAML

<ComboBox SelectedItem="{Binding From}"> 
    <ComboBox.ItemsSource> 
     <MultiBinding Converter="{StaticResource CombineListAndObjectMultiConverter}"> 
      <Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}" 
        Path="DataContext.AvailableNumbers"/> 
      <Binding Path="From" /> 
     </MultiBinding> 
    </ComboBox.ItemsSource> 
</ComboBox> 

和你CombineListAndObjectMultiConverter将简单对象添加到列表中,并返回列表。

+0

蕾切尔,我喜欢你的想法。不幸的是我没有使用MVVM。不过,我正在考虑将此控件移到MVVM,因为我没有看到其他方法。 – GAR8

+0

@ GAR8即使没有MVVM设计模式,它也应该可以工作 – Rachel