как мы можем получить доступ к элементам управления в Itemtemplate Silverlight - PullRequest
2 голосов
/ 16 февраля 2010

У меня есть список. У меня есть шаблон элемента с панелью стека в нем. в шаблоне элемента есть текстовое поле и флажок.

есть ли способ получить доступ к флажку и включить / отключить его для выбранного индекса?

<UserControl.Resources> <DataTemplate x:Key="UserApplicationsTemplate"> <StackPanel Orientation="Horizontal" Margin="2" ToolTipService.Placement="Mouse" ToolTipService.ToolTip="{Binding Description, Mode=OneWay}"> <TextBlock Text="{Binding Mode=OneWay}" TextWrapping="Wrap" Width="100" DataContext="{Binding ApplicationName, Mode=OneWay}" /> <CheckBox x:Name="{Binding ApplicationName, Mode=OneWay}" Margin="5,0,0,0" Click="IsActive_Clicked" IsChecked="{Binding IsActive, Mode=OneWay}" Content="IsActive"/> </StackPanel> </DataTemplate> </UserControl.Resources>

<ListBox x:Name="lstbxUserApplications" Height="357" ItemsSource="{Binding Mode=OneWay}" SelectionMode="Single" ItemTemplate="{StaticResource UserApplicationsTemplate}" />

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

Предполагается, что у вас есть связанный ItemSource:

<ListBox x:Name="myList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding Check, Mode=TwoWay}" />
                <TextBlock Text="{Binding Name, Mode=TwoWay}"
                           Width="100" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

<Button x:Name="button1"
        Content="Uncheck 2"
        Click="button1_Click" />

На самом деле вам не нужно изменять свойство CheckBox.IsChecked, но значение вашего ItemsSource:

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            myList.ItemsSource = ListInfo.getInfo();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ListInfo item = myList.Items[1] as ListInfo;
            item.Check = !item.Check;
        }
    }

    public class ListInfo : INotifyPropertyChanged
    {
        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                NotifyPropertyChange("Name");
            }
        }

        private bool check;
        public bool Check
        {
            get
            {
                return check;
            }
            set
            {
                check = value;
                NotifyPropertyChange("Check");
            }
        }

        public static ObservableCollection<ListInfo> getInfo()
        {
            ObservableCollection<ListInfo> data = new ObservableCollection<ListInfo>();
            data.Add(new ListInfo { Name = "Some text 1", Check = true });
            data.Add(new ListInfo { Name = "Some text 2", Check = false });
            data.Add(new ListInfo { Name = "Some text 3", Check = true });

            return data;
        }

        public void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
}

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

ОБНОВЛЕНИЕ: Я вижу, что это было не то, что вы просили. Вот пара идей:

Вы можете иметь обработчик событий для вашего флажка:

<ListBox x:Name="myList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding Check, Mode=TwoWay}"
                          IsEnabled="True"
                          Content="{Binding Name, Mode=TwoWay}"
                          Click="CheckBox_Click"  />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

И получите ссылку на код:

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    CheckBox chk = sender as CheckBox;
    chk.IsEnabled = false;
}

Конечно, проблема здесь в том, что если вы отключите флажок, вы потеряете доступ к Click envent.

Другой вариант - использовать VisualTreeHelper для получения ссылки на ваш CheckBox при изменении выбора в ListBox:

private void myList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox list = sender as ListBox;
    ListInfo current = list.SelectedItem as ListInfo;

    List<CheckBox> checkBoxes = new List<CheckBox>();
    getCheckBoxes(list, ref checkBoxes);

    foreach (CheckBox checkBox in checkBoxes)
    {
        if (checkBox.Content.ToString() == current.Name)
        {
            checkBox.Foreground = new SolidColorBrush(Colors.Red);
        }
    }
}

public void getCheckBoxes(UIElement parent, ref List<CheckBox> items)
{
    int count = VisualTreeHelper.GetChildrenCount(parent);
    if (count > 0)
    {
        for (int i = 0; i < count; i++)
        {
            UIElement child = VisualTreeHelper.GetChild(parent, i) as UIElement;
            if (child.GetType() == typeof(CheckBox))
            {
                items.Add(child as CheckBox);
            }
            getCheckBoxes(child, ref items);
        }
    }
}

Это, конечно, не лучший вариант для производительности, но вы получаете больше гибкости.

0 голосов
/ 16 февраля 2010

Вот решение с использованием RadioButtons:
http://leeontech.wordpress.com/2009/03/18/creating-radiobuttonlist/

Должно быть достаточно легко поменять его на флажки.

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