C# 视图模型初始化后,依赖项属性不起作用
我想编写一个自定义异步图像容器自定义控件。我已从此控件创建了一个列表:C# 视图模型初始化后,依赖项属性不起作用,c#,wpf,data-binding,custom-controls,dependency-properties,C#,Wpf,Data Binding,Custom Controls,Dependency Properties,我想编写一个自定义异步图像容器自定义控件。我已从此控件创建了一个列表: <ItemsControl ItemsSource="{Binding Items}"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <custom:CustomImage Width="64" Height="64" BaseUri="
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<custom:CustomImage Width="64" Height="64" BaseUri="{Binding Uri}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我想在自定义控件上设置一个依赖属性(您可以在上面看到:BaseUri=“{Binding Uri}”)。Uri是类a的属性
这是DP实施:
public Uri BaseUri
{
get { return (Uri)GetValue(BaseUriProperty); }
set { SetValue(BaseUriProperty, value); }
}
public static readonly DependencyProperty BaseUriProperty =
DependencyProperty.Register("BaseUri", typeof(Uri),
typeof(CustomImage), new FrameworkPropertyMetadata(default(Uri), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
仅当CustomImage自定义控件没有任何视图模型时,它才起作用。如果我在CustomImage的构造函数中执行此操作:
DataContext = new CustomImageViewModel();
它不再工作了
有什么想法吗?您不应该显式地设置UserControl的DataContext。这样做可以有效地防止DataContext从控件的父控件继承,因为这是绑定(如
BaseUri="{Binding Uri}"
因此,请删除该行
DataContext = new CustomImageViewModel();
来自控件的构造函数
如果不显式设置“控件没有任何视图模型”,则这不是真的。事实上,视图模型(或继承的DataContext)通过ItemsControl的item容器将设置为
ItemsSource
集合中的相应项。因此,控件的DataContext
将自动设置为类的实例A
除了答案中所述的内容外,还应使用ObservableCollection
而不是List
作为Items
属性的类型,在将项添加到集合或从集合中移除时启用内置更改通知。默认情况下,BaseUri
属性绑定双向(或完全绑定)似乎也没有意义。最后是“异步映像容器”看起来很奇怪,当您可以只使用图像控件并将其源属性设置为BitmapImage时,它已经实现了异步加载。但是我希望自定义控件有一个单独的视图模型,其中包含我需要的所有异步操作(和其他可绑定属性)。可能吗?“可能吗?”是的,但这没有意义。您想绑定控件的属性,如BaseUri=“{Binding Uri}”
,因此必须继承DataContext。哦,我明白了。谢谢!
BaseUri="{Binding Uri}"
DataContext = new CustomImageViewModel();