将ItemTemplate中的元素绑定到Windows Phone 7中ItemSsource之外的值

时间:2010-11-14 16:28:52

标签: data-binding xaml user-controls windows-phone-7 datatemplate

我有一个由UserControlListBox组成的自定义DataTemplateListBoxXAML中设置了源DataTemplateBinding中的元素从<UserControl x:Class="Test.UserControls.TracksListBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:converters="clr-namespace:Test.Converters" xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" mc:Ignorable="d" d:DesignHeight="480" d:DesignWidth="480" DataContext="{Binding RelativeSource={RelativeSource Self}}" Name="this"> <UserControl.Resources> <converters:BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter"/> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="transparent"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <CheckBox Grid.Row="0" IsChecked="{Binding Show}"/> <ListBox Grid.Row="1" Name="List"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel VerticalAlignment="Top" Margin="0 5 0 5"> <TextBlock Text="{Binding Title}"/> <CheckBox IsChecked="{Binding ElementName=this, Path=Show}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> 获取值。

我的UserControl XAML如下所示:

namespace Test.UserControls
{
    public partial class TracksListBox : UserControl
    {
        public static readonly DependencyProperty TracksListProperty =
            DependencyProperty.Register("TracksList",
            typeof(List<Track>),
            typeof(TracksListBox),
            new PropertyMetadata(null, OnTracksListChanged));

        public static readonly DependencyProperty ShowProperty =
            DependencyProperty.Register("Show",
            typeof(bool),
            typeof(TracksListBox),
            new PropertyMetadata(false));

        public TracksListBox()
        {
            InitializeComponent();
        }

        public List<Track> TracksList
        {
            get
            {
                return (List<Track>)GetValue(TracksListProperty);
            }
            set
            {
                SetValue(TracksListProperty, value);
            }
        }

        public bool Show
        {
            get
            {
                return (bool)GetValue(ShowProperty);
            }
            set
            {
                SetValue(ShowProperty, value);
            }
        }

        private static void OnTracksListChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            (obj as TracksListBox).OnTracksListChanged((List<Track>)args.OldValue, (List<Track>)args.NewValue);
        }

        protected virtual void OnTracksListChanged(List<Track> oldValue, List<Track> newValue)
        {
            List.ItemsSource = newValue;
        }
    }
}

代码隐藏:

<userControls:TracksListBox x:Name="TopTracksListBox"
                TracksList="{Binding ElementName=this, Path=TopTracks}"
                Show="True"/>

在我的MainPage.xaml中,我使用它:

CheckBox

我的问题是ListBox DataTemplate内的Show无法从CheckBox获取值。 Grid.Row="0"中的其他UserControl会获得正确的值...如何在DataTemplate的{​​{1}}内绑定ListBox中的值?

2 个答案:

答案 0 :(得分:0)

我将代码放入应用中的用户控件,将Track更改为string并且没有将任何内容绑定到列表但我仍然看到显示的复选框和{{1的绑定IsChecked为我工作。

答案 1 :(得分:0)

这肯定是一个错误,不管我尝试过CheckBox的DataContext总是最终为null或Track。如果你想解决它,你可以添加它,直到它得到修复

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel VerticalAlignment="Top" 
                Margin="0 5 0 5">
            <TextBlock Text="{Binding Title}"/>
            <CheckBox Loaded="CheckBox_Loaded"/>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

然后在加载后将代码中的Binding设置为

private void CheckBox_Loaded(object sender, RoutedEventArgs e)
{
    CheckBox checkBox = sender as CheckBox;
    Binding isCheckedBinding = new Binding("Show");
    isCheckedBinding.Source = this;
    checkBox.SetBinding(CheckBox.IsCheckedProperty, isCheckedBinding);
}