2

我创建了一个具有集合属性的用户控件:

    public static readonly DependencyProperty
    MyListProperty = DependencyProperty.Register(
        "MyList",
        typeof(ObservableCollection<Test>),
        typeof(UserControl1),
        new FrameworkPropertyMetadata(new ObservableCollection<Test>())
        );

    public ObservableCollection<Test> MyList
    {
        get { return (ObservableCollection<Test>)base.GetValue(MyListProperty); }
        set { base.SetValue(MyListProperty, value); }
    }

    public static readonly DependencyProperty
    BProperty = DependencyProperty.Register(
        "B",
        typeof(string),
        typeof(UserControl1),
        new FrameworkPropertyMetadata(null)
    );

    public string B
    {
        get { return (string)base.GetValue(BProperty); }
        set { base.SetValue(BProperty, value); }
    }

测试类是:

public class Test : DependencyObject
{
    public static readonly DependencyProperty
    AProperty = DependencyProperty.Register(
        "A",
        typeof(string),
        typeof(Test),
        new FrameworkPropertyMetadata(null)
    );

    public string A 
    {
        get { return (string)base.GetValue(AProperty); }
        set { base.SetValue(AProperty, value); }
    }
}

然后,我尝试使用我的控件进行绑定:

    <TextBox x:Name="tb1" Text="def"/>
    <my:UserControl1 x:Name="uc1" B="{Binding ElementName=tb1, Path=Text}">
        <my:UserControl1.MyList>
            <my:Test A="{Binding ElementName=tb1, Path=Text}"></my:Test>
            <my:Test A="100"></my:Test>
        </my:UserControl1.MyList>
    </my:UserControl1>

第一个绑定(具有用户控件的 B 属性)正常工作。问题在于第二个绑定(具有 Test 的 A 属性,即 MyList 元素)。调试时,我在 MyList 中有两个项目,但第一个的 A 属性为空。请告诉我我在这里缺少什么?

4

1 回答 1

1

这里的问题是,绑定到 ElementName=tb1 无法解决,即使它永远不会被评估。为 WPF 应用程序的可视化或逻辑树中的 DependencyObject 解析到 ElementName 的绑定。将项目添加到您的 ObservableCollection (MyList) 仅意味着将项目添加到集合中,而不是添加到可视化树中。

编辑:这是评论中讨论的方法:

在您的窗口/页面中:

<Window.Resources>
    <!-- Declare the ViewModel as Resource -->
    <my:ViewModel x:Key="viewModel">
        <my:ViewModel.MyList>
            <my:Test A="Hello sweet" />
            <my:Test A="ViewModel" />
        </my:ViewModel.MyList>
    </my:ViewModel>
</Window.Resources>

<!-- Assign Ressource as DataContext -->
<StackPanel DataContext="{StaticResource viewModel}">

    <TextBox x:Name="tb1" Text="def"/>

    <!-- Reference your list within the ViewModel -->
    <ListBox ItemsSource="{Binding Path=MyList}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <!-- Bind your property  -->
                <TextBlock Text="{Binding Path=A}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

以及 ViewModel 的实现:

public class ViewModel
{
    public ViewModel()
    {
        this.MyList = new ObservableCollection<Test>();
    }

    public ObservableCollection<Test> MyList { get; set; }
}

当然,Test 类不再需要实现 DependencyObject。简单的获取/设置属性就可以了。

于 2012-09-21T10:37:28.683 回答