ItemsControl:基于控件的“内容”更改ItemsControl中的控件属性

时间:2011-07-16 12:27:07

标签: c# .net wpf xaml itemscontrol

我有以下代码。

在我的示例中,我使用ItemControl显示按钮。 现在我需要根据其内容访问特定按钮 并改变其财产。

说,当我点击Background按钮时,我需要更改first按钮的ChangeBackGround属性。 [见我的问题下面的屏幕截图]

查看以下代码和屏幕截图:

XAML:

<Window x:Class="ItemControlProblem.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50*" />
            <RowDefinition Height="261*" />
        </Grid.RowDefinitions>
        <ItemsControl Name="itemControlProblem" ItemsSource="{Binding Path=DataCollection}" Grid.RowSpan="2">
            <ItemsControl.Template>
                <ControlTemplate TargetType="ItemsControl">
                    <Border>
                        <StackPanel>
                            <ItemsPresenter></ItemsPresenter>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"></StackPanel>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding Path=DataToPresent}"></Button>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        <Button Content="ChangeBackGround" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="215,104,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

背后的代码:

public partial class MainWindow : Window
    {
        private ObservableCollection<Data> dataCollection ;

        public MainWindow()
        {
            InitializeComponent();
            dataCollection = new ObservableCollection<Data>();

            dataCollection.Add(new Data("first"));
            dataCollection.Add(new Data("second"));
            dataCollection.Add(new Data("third"));
            dataCollection.Add(new Data("forth"));
            this.DataContext = this;
        }

        public ObservableCollection<Data> DataCollection
        {
            get
            {
                return this.dataCollection;
            }
            set
            {
                this.dataCollection = value;
            }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //I need to change Background of Perticular Button
            //Based On Content of Button [Here that is "first", "second", "third", "forth"]

            //How to change the color of perticular button based on Content of Button?
        }
    }

    public class Data 
    {
        private string dataToPresent;

        public Data()
        {

        }
        public Data(string dataArg)
        {
            this.dataToPresent = dataArg;
        }
        public string DataToPresent 
        {
            get
            {
                return this.dataToPresent;
            }
            set
            {
                this.dataToPresent = value;
            }
        }
    }

屏幕截图:

enter image description here

2 个答案:

答案 0 :(得分:3)

使用此方法查找视觉儿童:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

示例:

var buttonFirst = FindVisualChildren<Button>(itemControlProblem)
    .Single(b => b.Content.ToString() == "first");
buttonFirst.Background = Brushes.Yellow;

答案 1 :(得分:2)

示例:

<ItemsControl Name="ictest" ItemsSource="{Binding DpData}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Name="buton" Content="{Binding Name}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
for (int i = 0; i < ictest.Items.Count; i++)
{
    var container = ictest.ItemContainerGenerator.ContainerFromIndex(i) as ContentPresenter;
    var button = container.ContentTemplate.FindName("buton", container) as Button;
    if (button.Content == "Skeet")
    {
        button.Background = Brushes.Red;
    }
}

这样可行,但我不建议做这样的事情,设置一个带有background-property的viewmodel然后被绑定会更加清晰。