说我喜欢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>
我想问一下TabTitle
和Text
属性来自哪里?我认为应该来自Tabs
的每个项目吗? Say Tabs是ObservableCollection<TabViewModel>
TabTitle
&amp; Text
应该来自TabViewModel
属性。但在某种程度上似乎是正确的。 TabTitle
未正确填充Text
。
Text
在UserControl1
中声明为依赖属性,如下所示
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>
答案 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