【发布时间】:2019-01-03 12:19:26
【问题描述】:
我有一个自定义控件LookupPanelView,它由一个TextBox 和一个ListBox 组成。它有一个附加属性ItemsSource,ListBox 绑定到该属性,因此可以从控件外部设置绑定的数据。
public partial class LookupPanelView : UserControl
{
public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(LookupPanelView));
public IEnumerable ItemsSource
{
get => (IEnumerable)GetValue(ItemsSourceProperty);
set => SetValue(ItemsSourceProperty, value);
}
public LookupPanelView()
{
InitializeComponent();
}
}
控件的 ItemsSource 绑定到我的主 ViewModel 中的一个属性,该属性决定要显示哪些数据。
public class MainViewModel : ViewModelBase
{
public ObservableCollection<DomainObject> LookupPanelItems { get; private set; }
public MainViewModel()
{
LookupPanelItems = // Fetch the data to display in the control.
}
}
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
UseLayoutRounding="True">
<Grid>
<lookupPanelView:LookupPanelView Grid.Column="0" ItemsSource="{Binding LookupPanelItems}"/>
</Grid>
我想扩展自定义控件,使其具有搜索功能,您可以在其中键入 TextBox 并从 ListBox 中选择匹配项。这个逻辑应该包含在控件中,因为它应该知道如何搜索它自己的项目。我想我需要给控件它自己的 ViewModel 来保存逻辑,但是我如何访问 ViewModel 中的附加属性ItemsSource 来搜索项目?为了可维护性和可测试性,我想尽可能避免使用代码隐藏。
【问题讨论】:
-
我会为 UserControl 投票反对 ViewModel。此功能是特定于 UserControl 的,不应与 ViewModel 有任何联系,它只应期望数据和过滤器。顺便说一句
LookupPanelView散发着DevExpress的味道。 -
@XAMlMAX 感谢您的建议。你会在后面的代码中使用老式风格的事件来实现它吗?我不确定你的意思是“DevExpress 的味道”?
-
用户控件背后的想法是他们应该在不了解视图模型的情况下进行操作。所以你的控件应该过滤它在它的集合中的项目,这是唯一的问题。当我使用 UC 时,这就是我对背后代码所做的事情。只需确保为通用目的实现它,而不依赖于其集合中的特定类型的对象。对于 Dx 没关系 :-)
标签: c# wpf mvvm binding viewmodel