Привязать элемент в ItemTemplate к значению вне ItemSource в Windows Phone 7 - PullRequest
0 голосов
/ 14 ноября 2010

У меня есть пользовательский UserControl, который состоит из ListBox с DataTemplate.ListBox получает свой исходный набор в XAML, а элементы DataTemplate получают свои значения из Binding.

Мой UserControl XAML выглядит так:

<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>

И код:

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;
        }
    }
}

В моем MainPage.xaml я использую его так:

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

Моя проблема здесь в том, что CheckBoxвнутри ListBox DataTemplate не будет получено значение из Show.Другой CheckBox в Grid.Row="0", однако, получает правильное значение ... Как связать значение из моего UserControl внутри DataTemplate ListBox?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2010

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

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

, а затем установите привязку в коде после его загрузки

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);
}
0 голосов
/ 15 ноября 2010

Я поместил ваш код в пользовательский элемент управления в приложении, изменил Track на string и ничего не связывал со списком, но я все еще видел отображаемый флажок и работала привязка Show к IsChecked для меня.

...