Silverlight中是否有这样的内置控件?

时间:2012-04-12 23:55:18

标签: c# silverlight controls

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

(当然我可以自己编写代码,这很简单,我甚至可以为viewmodel添加一些逻辑来获得我需要的对并将它的描述绑定到简单的文本块)

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

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:第一个代码段很草率并且无法正常工作,所以我修复了它。

1 个答案:

答案 0 :(得分:1)

如果我理解得当,

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

(你确实需要一个清单?不只是一个项目,即使单一项目与任何控制类似)

将列表绑定到例如ItemsControl

ItemsSource设置为list of items

然后覆盖ToString上的Item,真正提供“你的”。如果没有,你可以自己制作包装纸。

在ToString中输出任何呈现您的项目的内容,例如:描述。

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

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

Text={Binding SelectedText}

e.g。
...在您的视图模型中添加SelectedTextSelectedID(以及Items,如果需要) - 正确执行OnPropertyChanged

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

相关问题