Binding 为什么';这不是WPF装订工作吗?

Binding 为什么';这不是WPF装订工作吗?,binding,Binding,我找不到工作用的活页夹。我创造了一个完全没有结果的例子来证明我的问题。事情是这样的 我希望能够在XAML中定义一组小部件。此集合将与UserControl关联。在XAML中,我希望将小部件的“Name”属性绑定到数据位(本例中为字符串) 因此,对于代码,我有一个从DependencyObject派生的小部件类 public class Widget : DependencyObject { public string Name { get { return (st

我找不到工作用的活页夹。我创造了一个完全没有结果的例子来证明我的问题。事情是这样的

我希望能够在XAML中定义一组小部件。此集合将与UserControl关联。在XAML中,我希望将小部件的“Name”属性绑定到数据位(本例中为字符串)

因此,对于代码,我有一个从DependencyObject派生的小部件类

public class Widget : DependencyObject
{
    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty NameProperty =
        DependencyProperty.Register("Name", typeof(string), typeof(Widget), new UIPropertyMetadata("--widget--"));

}
请注意,此属性的默认值为“-widget-->”。我还有一个WidgetCollection类

public class WidgetCollection : Collection<Widget>
{
    public WidgetCollection()
    {
    }
}
当这个演示运行时,窗口如下所示

[老鼠!因为我是一个新的提交者,所以图片被修改了]我将用文本模拟它

-----------
|         |
|         |  <--  red rectangle (the WidgetControl)
|         |
-----------
Sprocket
Crank        <--  textblocks
Wheel
Wrench
-----------
Sprocket
--widget--   <--  listbox
--widget--
Wrench
-----------
-----------
|         |

||我只是在暗中拍摄,但我认为您的DependencyProperty名称已正确绑定到,但当它从--widget--“更改为”Crank“时,更改不会传播到显示名称的任何位置。您需要在DependencyProperty.Register上设置回调


Widget到底做什么?

嗯,我找到了一些答案。这两种技术似乎都能奏效,而且都非常有用。作为一个新的海报,我只能提交一个超链接。因此,您可以搜索“将虚拟分支附加到逻辑树-由Josh Smith编写”,和/或您可以转到此链接以获取我最喜欢的

就我个人而言,我喜欢从Freezable派生我的小部件,因为它需要更少的填充,并且对初始化顺序不敏感。。Josh的解决方案只有在调用InitializeComponent()之后设置DataContext时才有效,就像这样

public MainWindow()
{
    Loaded += new RoutedEventHandler(MainWindow_Loaded);
    InitializeComponent();
    DataContext = this;
}
注意:在我的例子中,仅仅从Freezable派生小部件是不够的。我还必须从FreezableCollection派生WidgetCollection


案例结束。

在使用调试器时,我可以看到对于两个数据绑定小部件,“Name”仍然是--widget--。。。所以,这不仅仅是一个UI刷新/传播问题。在本例中,Widget除了帮助演示绑定问题外,什么都不做。@David:是否调用了属性“Name”的setter?已经有一段时间了,但这与您的基类是DependencyObject而不是UIElement、FrameworkElement或控件有关……我想。谢谢您的阅读和思考。我想你指的是Widget类吧?我试过了,但没有成功。
    <Window x:Class="StackOverflow.BindingProblem.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:StackOverflow.BindingProblem"
        Title="MainWindow" Height="220" Width="160"
        x:Name="x_win">
    <Grid>

        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <l:WidgetControl x:Name="x_WidgetControl" Grid.Row="0">
            <l:Widget Name="Sprocket"/>
            <l:Widget Name="{Binding Path=WidgetName1, ElementName=x_win}"/>
            <l:Widget Name="{Binding Path=WidgetName2, ElementName=x_win}"/>
            <l:Widget Name="Wrench"/>
        </l:WidgetControl>

        <StackPanel Orientation="Vertical" Grid.Row="1">
            <TextBlock Text="Sprocket"/>
            <TextBlock Text="{Binding Path=WidgetName1, ElementName=x_win}"/>
            <TextBlock Text="{Binding Path=WidgetName2, ElementName=x_win}"/>
            <TextBlock Text="Wrench"/>
        </StackPanel>

        <ListBox x:Name="x_ListBox" Grid.Row="2"/>
    </Grid>
</Window>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        Loaded += new RoutedEventHandler(MainWindow_Loaded);
        InitializeComponent();
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        x_ListBox.ItemsSource = x_WidgetControl.GetWidgetNames();
    }

    public string WidgetName1
    {
        get { return "Crank"; }
    }

    public string WidgetName2
    {
        get { return "Wheel"; }
    }
}
-----------
|         |
|         |  <--  red rectangle (the WidgetControl)
|         |
-----------
Sprocket
Crank        <--  textblocks
Wheel
Wrench
-----------
Sprocket
--widget--   <--  listbox
--widget--
Wrench
-----------
public MainWindow()
{
    Loaded += new RoutedEventHandler(MainWindow_Loaded);
    InitializeComponent();
    DataContext = this;
}