银光中有这样的内置控件吗?
本文关键字:内置 控件 | 更新日期: 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}
例如
...在您的视图模型中添加SelectedText
和SelectedID
(如果需要,Items
)- 正确执行OnPropertyChanged
。
从视图模型设置"SelectedID",或者如果从可能更改它的另一个控件"绑定",则设置 SelectedID。
在"选定 ID"的"设置"内,设置"选定文本"。
不需要这样的事情的控件,它实际上都是数据绑定。