简体   繁体   English

ItemControl:根据控件的“内容”改变ItemControl中控件的属性

[英]ItemControl: Change Property Of Control in ItemControl Based On “Content” of Control

I have the following code.我有以下代码。

In my Example I have Displaying Buttons using ItemControl .在我的示例中,我使用ItemControl显示按钮。 Now i need to access particular button based on its content and change its property.现在我需要根据其内容访问特定按钮并更改其属性。

say,, i nee to change Background property of first button when ChangeBackGround button being Clicked.比如说,当ChangeBackGround按钮时,我需要更改first按钮的Background属性。 [See Screen shot at very below at my Question] [请参阅我的问题下面的屏幕截图]

Have a look at below code and Screen Shot:看看下面的代码和屏幕截图:

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

CODE BEHIND:代码背后:

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

Screen Shot:截屏:

在此处输入图像描述

Use this method to find visual children:使用此方法查找可视子项:

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

Example:例子:

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

Example:例子:

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

This works, but i would not suggest doing something like this, setting up a viewmodel with a background-property which then is bound would be much cleaner.这可行,但我不建议做这样的事情,设置一个带有背景属性的视图模型,然后绑定会更干净。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM