银光中有这样的内置控件吗?

本文关键字:内置 控件 | 更新日期: 2023-09-27 18:31:09

我有一个带有ID和描述的项目列表(如果需要,我可以引入键值集合)。我需要的是绑定到 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。我可以将此控件放在页面上,绑定项,并单向绑定 SelectedID。

编辑2:好吧,我没有制作SelectedID依赖项属性,因此绑定不起作用,但我会立即修复它

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

银光中有这样的内置控件吗?

如果我理解正确,

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

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

将列表绑定到例如 ItemsControl .

ItemsSource设置为您的list of items

然后覆盖Item上的ToString,前提是它真的是"你的"。如果没有,您可以制作自己的包装纸。

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

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

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

Text={Binding SelectedText}

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

从视图模型设置"SelectedID",或者如果从可能更改它的另一个控件"绑定",则设置 SelectedID。
在"选定 ID"的"设置"内,设置"选定文本"。
不需要这样的事情的控件,它实际上都是数据绑定。