[英]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.