1

我有一个带有 id 和描述的项目列表(如果需要,我可以引入键值集合)。我需要的是绑定到 viewmodel id 属性的控件,但在其上显示相应项目/对的描述。我知道的最接近的例子是组合框,我在其中设置了 DisplayMemberPath 和 SelectedValue/SelectedValuePath,但我不需要下拉菜单。那么 Silverlight 中是否有任何内置控件呢?

(当然我可以自己编写一个,这很容易,我什至可以为视图模型添加一些逻辑来获得我需要的配对并将其描述绑定到简单的文本块)

编辑:为了说明我需要什么功能,我编写了简单的示例类。它实际上满足了我的需求,但我仍然想知道我是否可以使用内置控件

public class CollectionItemDisplayControl:TextBox
{
    public CollectionItemDisplayControl()
    {
        IsReadOnly = true;

    }

    public string SelectedID
    {
        get { return (string)GetValue(SelectedIDProperty); }
        set { SetValue(SelectedIDProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedID.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedIDProperty =
        DependencyProperty.Register("SelectedID", typeof(string), typeof(CollectionItemDisplayControl), new PropertyMetadata(new PropertyChangedCallback(OnSelectedIDChangedStatic)));


    private static void OnSelectedIDChangedStatic(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        CollectionItemDisplayControl originator = d as CollectionItemDisplayControl;
        if (originator != null)
        {
            originator.OnSelectedIDChanged(e);
        }
    }

    private void OnSelectedIDChanged(DependencyPropertyChangedEventArgs e)
    {
        string description = String.Empty;
        string value = e.NewValue as string;
        if (value != null)
        {
            foreach (var item in _items)
            {
                if (item.UniqueID == value)
                {
                    description = item.Description;
                    break;
                }
            }
        }
        Text = description;
    }        

    private IDataCollection _viewModel;
    public IDataCollection ViewModel
    {
        get { return _viewModel; }
        set
        {
            _viewModel = value;
            if (_viewModel != null)
            {
                _items = _viewModel.Items;
            }
        }
    }

    private ObservableCollection<IUnique> _items = new ObservableCollection<IUnique>();

}

ItemClass 包含两个属性:ID 和Description。我可以把这个控件放在页面上,绑定Items,单向绑定SelectedID。

编辑 2:好吧,我没有制作 SelectedID DependencyProperty,所​​以绑定不起作用,但我会立即修复它

编辑 3:第一个片段草率且无法正常工作,所以我修复了它。

4

1 回答 1

1

如果我理解正确,

您只需要实施正确的绑定。

(您确实需要一个列表?不仅仅是一个项目,即使是单个它也类似于任何控件)

将列表绑定到 eg ItemsControl

设置ItemsSource为您的list of items

然后覆盖ToStringItem提供它真的是“你的”。如果没有,您可以制作自己的包装器。

在 ToString 输出中显示您的项目的任何内容,例如描述。

这是一个最快的解决方案,您也可以根据需要制作项目模板。

编辑:
只需将所有内容放在视图模型中并绑定到它 - 文本框,即

Text={Binding SelectedText}

例如
...在您的视图模型中添加SelectedTextSelectedIDItems如果需要) - 正确执行OnPropertyChanged.

从视图模型中设置 SelectedID,或者如果从另一个可能更改它的控件“绑定”。
在 SelectedID 的集合中设置 SelectedText。
不需要控制这样的事情,它实际上都是数据绑定。

于 2012-04-13T00:10:14.550 回答