初始化视图模型后,依赖项 属性 不起作用
Dependency Property does not work after view model was initialized
我想写一个自定义的异步图像容器自定义控件。我从这个控件创建了一个列表:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<custom:CustomImage Width="64" Height="64" BaseUri="{Binding Uri}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
项目 属性 是我在 MainWindowViewModel 中初始化的对象 A 的列表:
public List<A> Items { get; set; } = new List<A>();
和
foreach (XmlNode item in doc.LastChild.FirstChild.SelectNodes(".//item"))
{
Items.Add(
new A
{
Title = item.FirstChild.InnerText,
Uri = new Uri(item.SelectNodes(".//enclosure")[0].Attributes["url"].Value)
}
);
}
我想在自定义控件上设置一个Dependency 属性(你可以在上面看到:BaseUri="{Binding Uri}"。Uri是属性的class 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();
来自控件的构造函数。
当您没有明确设置时,"control doesn't have any view model" 是不正确的。事实上,视图模型(或继承的 DataContext)通过 ItemsControl 的项目容器设置为 ItemsSource
集合中的适当项目。因此,您的控件的 DataContext
会自动设置为您的 class A
.
的实例
我想写一个自定义的异步图像容器自定义控件。我从这个控件创建了一个列表:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<custom:CustomImage Width="64" Height="64" BaseUri="{Binding Uri}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
项目 属性 是我在 MainWindowViewModel 中初始化的对象 A 的列表:
public List<A> Items { get; set; } = new List<A>();
和
foreach (XmlNode item in doc.LastChild.FirstChild.SelectNodes(".//item"))
{
Items.Add(
new A
{
Title = item.FirstChild.InnerText,
Uri = new Uri(item.SelectNodes(".//enclosure")[0].Attributes["url"].Value)
}
);
}
我想在自定义控件上设置一个Dependency 属性(你可以在上面看到:BaseUri="{Binding Uri}"。Uri是属性的class 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();
来自控件的构造函数。
当您没有明确设置时,"control doesn't have any view model" 是不正确的。事实上,视图模型(或继承的 DataContext)通过 ItemsControl 的项目容器设置为 ItemsSource
集合中的适当项目。因此,您的控件的 DataContext
会自动设置为您的 class A
.