【问题标题】:ItemControl: Change Property Of Control in ItemControl Based On "Content" of ControlItemsControl:根据控件的“内容”改变ItemsControl中控件的属性
【发布时间】:2011-07-16 12:27:07
【问题描述】:

我有以下代码。

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

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

看看下面的代码和屏幕截图:

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

屏幕截图:

【问题讨论】:

    标签: c# .net wpf xaml itemscontrol


    【解决方案1】:

    使用此方法查找可视子项:

    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;
    

    【讨论】:

      【解决方案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;
          }
      }
      

      这可行,但我不建议做这样的事情,设置一个带有背景属性的视图模型,然后绑定会更干净。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多