Почему мои привязки UserControl не работают? - PullRequest
2 голосов
/ 13 августа 2011

Я думал, что это будет довольно просто сделать, но, похоже, мне не хватает чего-то ослепительно очевидного.

Проблема в том, что я передаю значения в мой UserControl (BoxPanel), но значения не отображаются. Синее поле отображается без текста.

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <l:BoxPanel Number="1" Text="Hi" />
    </Grid>
</Window>

BoxPanel.xaml

<UserControl x:Class="WpfApplication1.BoxPanel"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         Height="50" Width="90">
<Border Background="Blue">
    <StackPanel>
        <TextBlock FontSize="20" HorizontalAlignment="Center" 
            Text="{Binding Number}" />
        <Label FontSize="10" HorizontalAlignment="Center" Foreground="White" 
            Content="{Binding Text}" />
    </StackPanel>
</Border>

BoxPanel.xaml.xs

public partial class BoxPanel : UserControl
{
    public static readonly DependencyProperty NumberProperty = 
        DependencyProperty.Register("Number", typeof(decimal), typeof(BoxPanel));
    public static readonly DependencyProperty TextProperty = 
        DependencyProperty.Register("Text", typeof(string), typeof(BoxPanel));

    public BoxPanel()
    {
        InitializeComponent();
    }

    public decimal Number
    {
        get { return (decimal)GetValue(NumberProperty); }
        set { SetValue(NumberProperty, value); }
    }

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

1 Ответ

0 голосов
/ 13 августа 2011

Пути привязки по умолчанию коренятся в DataContext.Но вы хотите связать со свойствами, определенными в UserControl.Таким образом, вы должны как-то перенаправить их.Обычно я просто делаю это с помощью ElementName.

<UserControl x:Class="WpfApplication1.BoxPanel"
         x:Name="BoxPanelRoot"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         Height="50" Width="90">
<Border Background="Blue">
    <StackPanel>
        <TextBlock Text="{Binding Number, ElementName=BoxPanelRoot}" />
        <Label Content="{Binding Text, ElementName=BoxPanelRoot}" />
    </StackPanel>
</Border>

Сначала это кажется немного странным и несколько раздражающим для перенаправления привязок, подобных этому, но это предпочтительнее, чем другие методы, которые используют DataContext в UserControl,Если вы блокируете DataContext, скажем, устанавливая его в корень UserControl, вы фактически заблокировали лучший способ передачи данных в UserControl.

Практическое правило: при связывании в UserControl оставляйте DataContext в покое, если только вы явно не связываетесь с данными , переданными UserControl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...