WPF: привязки не работают правильно - PullRequest
0 голосов
/ 31 октября 2010

Скажи, что у меня 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 верно? Скажем, табуляция ObservableCollection<TabViewModel> TabTitle & 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>

Ответы [ 2 ]

0 голосов
/ 16 июля 2011

Если вы привязываете UserControl к свойству из файла code-behind, вы должны использовать

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

Прямое связывание, поскольку у вас работает только для DataContext

0 голосов
/ 31 октября 2010

Я думаю, я знаю, в чем проблема.Элемент в 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>
...