C# 在xaml中为集合中的元素定义绑定是行不通的
我有一个包含元素集合的简单控件。我想在xaml中添加元素并绑定到元素 然而,当我绑定到xaml中的Bar.Value时,它永远不会工作。最简单的例子:C# 在xaml中为集合中的元素定义绑定是行不通的,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我有一个包含元素集合的简单控件。我想在xaml中添加元素并绑定到元素 然而,当我绑定到xaml中的Bar.Value时,它永远不会工作。最简单的例子: [ContentProperty(“条”)] 公共类FooControl:控件 { 私有ObservableCollection _bars=新ObservableCollection(); 公共可观察收集条{get{return\u Bars;}} } 公共接口IBar { 字符串值{get;} } 公共类栏:DependencyObject,
[ContentProperty(“条”)]
公共类FooControl:控件
{
私有ObservableCollection _bars=新ObservableCollection();
公共可观察收集条{get{return\u Bars;}}
}
公共接口IBar
{
字符串值{get;}
}
公共类栏:DependencyObject,IBar
{
public static readonly dependencProperty ValueProperty=dependencProperty.Register(“Value”、typeof(string)、typeof(Bar)、new PropertyMetadata(“”);
公共字符串值
{
获取{return(string)GetValue(ValueProperty);}
set{SetValue(ValueProperty,value);}
}
}
来自DataContext
输出
directly set
from_binding_source
"<not set>"
"<not set>"
直接设置
从\u绑定\u源
""
""
调试输出
System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:Path=Text;DataItem=null;目标元素为“Bar”(HashCode=26568931);目标属性为“值”(类型为“字符串”)
有什么建议可以让它发挥作用吗?
我目前的解决方法是在代码中定义绑定,但这要比代码多得多,而且查看xaml并不清楚哪些绑定确实存在。(有关解决方案代码,请参见我的答案)不知道这是否有帮助,但是
[ContentProperty("Bars")]
public class FooControl : Control
{
private ObservableCollection<object> _bars = new ObservableCollection<object>();
public ObservableCollection<object> Bars { get { return _bars; } }
}
[ContentProperty(“条”)]
公共类FooControl:控件
{
私有ObservableCollection _bars=新ObservableCollection();
公共可观察收集条{get{return\u Bars;}}
}
xaml
你得到了你想要的结果
不知道这是否有帮助,但是
[ContentProperty("Bars")]
public class FooControl : Control
{
private ObservableCollection<object> _bars = new ObservableCollection<object>();
public ObservableCollection<object> Bars { get { return _bars; } }
}
[ContentProperty(“条”)]
公共类FooControl:控件
{
私有ObservableCollection _bars=新ObservableCollection();
公共可观察收集条{get{return\u Bars;}}
}
xaml
你得到了你想要的结果
到目前为止我的解决方法
<this:Bar x:Name="bar3" />
<this:Bar x:Name="bar4" />
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var bar3 = (DependencyObject)FindName("bar3");
BindingOperations.SetBinding(bar3, Bar.ValueProperty, new Binding("DataContext") { Source = this });
var bar4 = (DependencyObject)FindName("bar4");
BindingOperations.SetBinding(bar4, Bar.ValueProperty, new Binding("Text") { Source = FindName("SomeTextBlock") });
}
已加载无效主窗口(对象发送器、路由目标)
{
var bar3=(DependencyObject)FindName(“bar3”);
BindingOperations.SetBinding(bar3,Bar.ValueProperty,新绑定(“DataContext”){Source=this});
var bar4=(DependencyObject)FindName(“bar4”);
BindingOperations.SetBinding(bar4,Bar.ValueProperty,新绑定(“Text”){Source=FindName(“SomeTextBlock”)});
}
到目前为止我的解决方法
<this:Bar x:Name="bar3" />
<this:Bar x:Name="bar4" />
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var bar3 = (DependencyObject)FindName("bar3");
BindingOperations.SetBinding(bar3, Bar.ValueProperty, new Binding("DataContext") { Source = this });
var bar4 = (DependencyObject)FindName("bar4");
BindingOperations.SetBinding(bar4, Bar.ValueProperty, new Binding("Text") { Source = FindName("SomeTextBlock") });
}
已加载无效主窗口(对象发送器、路由目标)
{
var bar3=(DependencyObject)FindName(“bar3”);
BindingOperations.SetBinding(bar3,Bar.ValueProperty,新绑定(“DataContext”){Source=this});
var bar4=(DependencyObject)FindName(“bar4”);
BindingOperations.SetBinding(bar4,Bar.ValueProperty,新绑定(“Text”){Source=FindName(“SomeTextBlock”)});
}
不幸的是,没有。我发布的是一个显示问题的最小示例。您发布的代码滥用了ItemsControl检查可视元素的事实。IBar实际上是一个插件点,它扩展了Foo的功能,并且没有显示它自己,不幸的是没有。我发布的是一个显示问题的最小示例。您发布的代码滥用了ItemsControl检查可视元素的事实。IBar实际上是一个插件点,它扩展了Foo的功能,并且没有显示它自己。你可以为你的实际解决方案发布代码吗?你可以为你的实际解决方案发布代码吗