困难的telerik:RadCombobox ItemsSource绑定

时间:2011-08-29 21:34:05

标签: wpf binding .net-3.5 telerik itemssource

我遇到了困难的约束情况。我正在使用Telerik RadGridView和GridViewComboBoxColumn。我有两个组合框,一个“From”和一个“To”绑定List<int>。当用户放下“打开”组合框时,显示的值应反映“可用”整数范围。可用的整数由当前行From和To范围中的整数范围减去其他行中的范围组成。

我遇到的问题是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,因此第二行的选定项目在列表中不再可用,并且不会显示在网格中。 在第1行的“从组合框”关闭后,第二行的“从组合框”应显示“37”。我需要一种方法来记住非选定行的值,并在From组合框中显示这些值,即使它们在绑定列表中找不到。

仅供参考:我不关心这里的TO组合框,可能任何FROM解决方案也可以应用于TO组合框。

我知道这很令人困惑,请问你是否有疑问。基本上我需要一种方法来保留未选择的行选定项目,当这些项目不再出现在绑定列表中时。我只需要显示原始选择的值。在打开下拉列表之前,第二行组合框中的项目并不重要。然后这种情况发生逆转,我需要能够回忆起第一行的选定项目。

    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 个答案:

答案 0 :(得分:1)

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

ViewModel中,保留ObservableCollection个可用选项。这是您的数据项未使​​用的任何数字。每当数据项的ToFrom属性发生更改时,请更改可用选项列表。

然后将您的ComboBox绑定到可用选项列表,并使用多转换器将当前选定的项添加到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只会将一个对象添加到列表中并返回列表。