WPF:绑定无法正常工作

时间:2010-10-31 03:03:32

标签: wpf data-binding xaml dependency-properties

说我喜欢XAML

<TabControl Grid.Row="1" Grid.Column="2" ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding TabTitle}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <local:UserControl1 Text="{Binding Text}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

我想问一下TabTitleText属性来自哪里?我认为应该来自Tabs的每个项目吗? Say Tabs是ObservableCollection<TabViewModel> TabTitle&amp; Text应该来自TabViewModel属性。但在某种程度上似乎是正确的。 TabTitle未正确填充Text

TextUserControl1中声明为依赖属性,如下所示

public string Text
{
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""));

如果我没有绑定到ObservableCollection<TabViewModel>绑定的标签可以正常工作

<TabControl Grid.Row="1" Grid.Column="1">
    <TabItem Header="Tab 1">
        <local:UserControl1 Text="Hello" />
    </TabItem>
    <TabItem Header="Tab 2">
        <local:UserControl1 Text="World" />
    </TabItem>
</TabControl>

2 个答案:

答案 0 :(得分:0)

我想我知道这是什么问题。 UserControl1中的元素(应由Text属性填充)不会观察到此属性的更改。所以有两种方式:

1)使用PropertyChangedCallback:

public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""),
    new PropertyChangedCallback(OnTextPropertyChanged));

private static void OnTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    ((UserControl1)sender).OnTextChanged();
}

private void OnTextChanged()
{
    this.myTextBlock.Text = this.Text;
}

2)棘手的束缚:

<UserControl x:Class="UserControl1" x:Name="root" ...>
...
    <TextBlock Text="{Binding Text, ElementName=root}"/>
...
</UserControl>

答案 1 :(得分:0)

如果您正在将代码隐藏文件中的UserControl绑定到属性,则应使用

 {Binding RelativeSource={RelativeSource Mode=Self}, Path=Text}

直接绑定因为你只适用于DataContext