C# WPF ItemsControl:-在运行时更改ItemsControl的ItemSource属性后,更改ItemsControl中的项的属性
我有以下场景: 我使用了一个C# WPF ItemsControl:-在运行时更改ItemsControl的ItemSource属性后,更改ItemsControl中的项的属性,c#,.net,wpf,xaml,styles,C#,.net,Wpf,Xaml,Styles,我有以下场景: 我使用了一个ItemsControl 根据提供给它的项目资源,哪个按钮生成按钮 现在, 当我点击下一个按钮时[查看一下主窗口.xaml] ItemsControl(页面控制)的ItemsSource 而且还必须根据我的场景更改按钮的背景,该按钮的内容等于CurrentPage属性 假设, 步骤1:在按钮的单击事件中首先,我将更改项目控件的项目资源 第2步:然后我将更改特定按钮的背景。 但我得到的不是背景的改变,而是以下错误 This operation is valid only
ItemsControl
根据提供给它的项目资源
,哪个按钮生成按钮
现在,
当我点击下一个按钮时[查看一下主窗口.xaml]
ItemsControl
(页面控制)的ItemsSource
而且还必须根据我的场景更改按钮的背景,该按钮的内容等于CurrentPage
属性
假设,
步骤1:在按钮的单击事件中首先,我将更改项目控件的项目资源
第2步:然后我将更改特定按钮的背景。
但我得到的不是背景的改变,而是以下错误
This operation is valid only on elements that have this template applied.
注意:-如果我直接更改背景
而不更改项目资源
查看下面的代码。
main window.xaml
<Window x:Class="CurrentPageProblem.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">
<Window.Resources>
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border CornerRadius="2,2,2,2" HorizontalAlignment="Center" x:Name="borderTemplate" Background="{TemplateBinding Background}">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="borderTemplate" Property="Border.BorderBrush" Value="Gray" />
<Setter TargetName="borderTemplate" Property="Border.BorderThickness" Value="1" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="borderTemplate" Property="Border.BorderBrush" Value="Lime" />
</Trigger>
<Trigger Property="IsFocused" Value="true">
<Setter TargetName="borderTemplate" Property="Border.Background" Value="#FD7" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="borderTemplate" Property="Border.Background" Value="LightGray"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="47*" />
<RowDefinition Height="264*" />
</Grid.RowDefinitions>
<ItemsControl Name="pageControl" ItemsSource="{Binding Path=PageCollection}" Grid.Row="0">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Border >
<StackPanel>
<ItemsPresenter></ItemsPresenter>
</StackPanel>
</Border>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel x:Uid="pageItemTemplate">
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="pageNumberButton" Margin="3,4" Style="{StaticResource buttonStyle}" Content="{Binding Path=Page_Number}"></Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="Next" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="136,98,0,0" Name="nextButton" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
<Window x:Class="CurrentPageProblem.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"
xmlns:Local="clr-namespace:CurrentPageProblem">
<Window.Resources>
<Local:ButtonColorConverter x:Key="myConverter">
</Local:ButtonColorConverter>
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border CornerRadius="2,2,2,2" HorizontalAlignment="Center" x:Name="borderTemplate" Background="{TemplateBinding Background}">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="borderTemplate" Property="Border.BorderBrush" Value="Gray" />
<Setter TargetName="borderTemplate" Property="Border.BorderThickness" Value="1" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="borderTemplate" Property="Border.BorderBrush" Value="Lime" />
</Trigger>
<Trigger Property="IsFocused" Value="true">
<Setter TargetName="borderTemplate" Property="Border.Background" Value="#FD7" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="borderTemplate" Property="Border.Background" Value="LightGray"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="47*" />
<RowDefinition Height="264*" />
</Grid.RowDefinitions>
<ItemsControl Name="pageControl" ItemsSource="{Binding Path=PageCollection}" Grid.Row="0">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Border >
<StackPanel>
<ItemsPresenter></ItemsPresenter>
</StackPanel>
</Border>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel x:Uid="pageItemTemplate">
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="pageNumberButton" Margin="3,4" Style="{StaticResource buttonStyle}" Content="{Binding Path=Page_Number}">
<Button.Background>
<MultiBinding Converter="{StaticResource myConverter}">
<Binding Path="CurrentPage" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" />
<Binding Path="Page_Number" />
</MultiBinding>
</Button.Background>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="Next" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="136,98,0,0" Name="nextButton" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
Mainwindow.xaml.cs
public partial class MainWindow : Window,INotifyPropertyChanged
{
ObservableCollection<PageNumber> pageCollection = new ObservableCollection<PageNumber>();
public MainWindow()
{
InitializeComponent();
pageCollection.Add(new PageNumber(" 0 "));
pageCollection.Add(new PageNumber(" 1 "));
pageCollection.Add(new PageNumber(" 2 "));
pageCollection.Add(new PageNumber(" 3 "));
pageCollection.Add(new PageNumber(" 4 "));
pageCollection.Add(new PageNumber(" 5 "));
this.DataContext = this;
}
public ObservableCollection<PageNumber> PageCollection
{
get { return this.pageCollection; }
set
{
this.pageCollection = value;
this.OnPropertyChanged("PageCollection");
}
}
private int currentPage;
public int CurrentPage
{
get { return currentPage; }
set
{
currentPage = value;
this.OnPropertyChanged("CurrentPage");
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
#region -- IF I COMMENT THIS MUCH CODE THEN THERE IS NO PROBLEM,,,PROBLEM OCCURES WHEN I UNCOMMENT THE CODE,,, --
pageCollection.Clear();
pageCollection.Add(new PageNumber(" 0 "));
pageCollection.Add(new PageNumber(" 1 "));
pageCollection.Add(new PageNumber(" 2 "));
#endregion
for (int i = 0; i < pageControl.Items.Count; i++)
{
var container = pageControl.ItemContainerGenerator.ContainerFromIndex(i) as ContentPresenter;
var button = container.ContentTemplate.FindName("pageNumberButton", container) as Button;
if (button.Content.Equals(string.Format(" {0} ", currentPage)))
{
button.Background = Brushes.NavajoWhite;
}
else
{
button.Background = nextButton.Background;
}
}
currentPage++;
}
#region -- INotifyPropertyChanged Members --
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyNameArg)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this,new PropertyChangedEventArgs(propertyNameArg));
}
}
#endregion
}
public class PageNumber
{
private string page_Number;
public PageNumber(string pageNumberArg)
{
this.page_Number = pageNumberArg;
}
public string Page_Number
{
get { return page_Number; }
set
{
page_Number = value;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
namespace CurrentPageProblem
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<PageNumber> pageCollection = new ObservableCollection<PageNumber>();
public MainWindow()
{
InitializeComponent();
pageCollection.Add(new PageNumber(" 0 "));
pageCollection.Add(new PageNumber(" 1 "));
pageCollection.Add(new PageNumber(" 2 "));
pageCollection.Add(new PageNumber(" 3 "));
pageCollection.Add(new PageNumber(" 4 "));
pageCollection.Add(new PageNumber(" 5 "));
this.DataContext = this;
}
public ObservableCollection<PageNumber> PageCollection
{
get { return this.pageCollection; }
set
{
this.pageCollection = value;
}
}
private int currentPage;
public int CurrentPage
{
get { return currentPage; }
set
{
currentPage = value;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
#region -- THIS CODE WORKS FINE NOW --
pageCollection.Clear();
pageCollection.Add(new PageNumber(" 0 "));
pageCollection.Add(new PageNumber(" 1 "));
pageCollection.Add(new PageNumber(" 2 "));
pageCollection.Add(new PageNumber(" 3 "));
pageCollection.Add(new PageNumber(" 4 "));
pageCollection.Add(new PageNumber(" 5 "));
pageCollection.Add(new PageNumber(" 6 "));
pageCollection.Add(new PageNumber(" 7 "));
pageCollection.Add(new PageNumber(" 8 "));
pageCollection.Add(new PageNumber(" 9 "));
#endregion
currentPage++;
}
}
public class ButtonColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string current = string.Format(" {0} ", values[0]);
string button = (string)values[1];
return button == current
? Brushes.NavajoWhite
: Brushes.White; //set the desired color
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class PageNumber
{
private string page_Number;
public PageNumber(string pageNumberArg)
{
this.page_Number = pageNumberArg;
}
public string Page_Number
{
get { return page_Number; }
set
{
page_Number = value;
}
}
}
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
ObservableCollection pageCollection=新的ObservableCollection();
公共主窗口()
{
初始化组件();
添加(新的页码(“0”);
pageCollection.Add(新的页码(“1”));
pageCollection.Add(新的页码(“2”));
pageCollection.Add(新页码(“3”));
pageCollection.Add(新页码(“4”);
pageCollection.Add(新的页码(“5”));
this.DataContext=this;
}
公共可观测集合页面集合
{
获取{返回this.pageCollection;}
设置
{
this.pageCollection=值;
此.OnPropertyChanged(“页面集合”);
}
}
私人网页;
公共int当前页
{
获取{return currentPage;}
设置
{
currentPage=值;
此.OnPropertyChanged(“当前页面”);
}
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
#区域--如果我注释了这么多代码,那么就没有问题,,,当我取消注释代码时,问题就出现了--
pageCollection.Clear();
添加(新的页码(“0”);
pageCollection.Add(新的页码(“1”));
pageCollection.Add(新的页码(“2”));
#端区
对于(int i=0;i
从DependencyObject派生的对象不需要INotifyPropertyChanged接口。您应该改用DependencyProperty
这不是一个问题
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="pageNumberButton" Margin="3,4" Style="{StaticResource buttonStyle}" Content="{Binding Path=Page_Number}">
<Button.Background>
<MultiBinding Converter="{StaticResource xxx}"> //specify the converter seen above
<Binding Path="CurrentPage" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" />
<Binding Path="Page" />
</MultiBinding>
</Button.Background>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
<Window x:Class="CurrentPageProblem.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"
xmlns:Local="clr-namespace:CurrentPageProblem">
<Window.Resources>
<Local:ButtonColorConverter x:Key="myConverter">
</Local:ButtonColorConverter>
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border CornerRadius="2,2,2,2" HorizontalAlignment="Center" x:Name="borderTemplate" Background="{TemplateBinding Background}">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="borderTemplate" Property="Border.BorderBrush" Value="Gray" />
<Setter TargetName="borderTemplate" Property="Border.BorderThickness" Value="1" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="borderTemplate" Property="Border.BorderBrush" Value="Lime" />
</Trigger>
<Trigger Property="IsFocused" Value="true">
<Setter TargetName="borderTemplate" Property="Border.Background" Value="#FD7" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="borderTemplate" Property="Border.Background" Value="LightGray"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="47*" />
<RowDefinition Height="264*" />
</Grid.RowDefinitions>
<ItemsControl Name="pageControl" ItemsSource="{Binding Path=PageCollection}" Grid.Row="0">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Border >
<StackPanel>
<ItemsPresenter></ItemsPresenter>
</StackPanel>
</Border>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel x:Uid="pageItemTemplate">
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="pageNumberButton" Margin="3,4" Style="{StaticResource buttonStyle}" Content="{Binding Path=Page_Number}">
<Button.Background>
<MultiBinding Converter="{StaticResource myConverter}">
<Binding Path="CurrentPage" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" />
<Binding Path="Page_Number" />
</MultiBinding>
</Button.Background>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="Next" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="136,98,0,0" Name="nextButton" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
namespace CurrentPageProblem
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<PageNumber> pageCollection = new ObservableCollection<PageNumber>();
public MainWindow()
{
InitializeComponent();
pageCollection.Add(new PageNumber(" 0 "));
pageCollection.Add(new PageNumber(" 1 "));
pageCollection.Add(new PageNumber(" 2 "));
pageCollection.Add(new PageNumber(" 3 "));
pageCollection.Add(new PageNumber(" 4 "));
pageCollection.Add(new PageNumber(" 5 "));
this.DataContext = this;
}
public ObservableCollection<PageNumber> PageCollection
{
get { return this.pageCollection; }
set
{
this.pageCollection = value;
}
}
private int currentPage;
public int CurrentPage
{
get { return currentPage; }
set
{
currentPage = value;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
#region -- THIS CODE WORKS FINE NOW --
pageCollection.Clear();
pageCollection.Add(new PageNumber(" 0 "));
pageCollection.Add(new PageNumber(" 1 "));
pageCollection.Add(new PageNumber(" 2 "));
pageCollection.Add(new PageNumber(" 3 "));
pageCollection.Add(new PageNumber(" 4 "));
pageCollection.Add(new PageNumber(" 5 "));
pageCollection.Add(new PageNumber(" 6 "));
pageCollection.Add(new PageNumber(" 7 "));
pageCollection.Add(new PageNumber(" 8 "));
pageCollection.Add(new PageNumber(" 9 "));
#endregion
currentPage++;
}
}
public class ButtonColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string current = string.Format(" {0} ", values[0]);
string button = (string)values[1];
return button == current
? Brushes.NavajoWhite
: Brushes.White; //set the desired color
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class PageNumber
{
private string page_Number;
public PageNumber(string pageNumberArg)
{
this.page_Number = pageNumberArg;
}
public string Page_Number
{
get { return page_Number; }
set
{
page_Number = value;
}
}
}
}