C# 在xaml中为集合中的元素定义绑定是行不通的

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,

我有一个包含元素集合的简单控件。我想在xaml中添加元素绑定到元素

然而,当我绑定到xaml中的Bar.Value时,它永远不会工作。最简单的例子:

[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的功能,并且没有显示它自己。你可以为你的实际解决方案发布代码吗?你可以为你的实际解决方案发布代码吗