我想更改某些单元格的颜色并访问不同单元格的按钮。
我希望在调用datagrid的Loaded事件时执行此操作。
当前数据网格:
<DataGrid SelectionUnit="FullRow" SelectionMode="Single" AutoGenerateColumns="False" Height="468" HorizontalAlignment="Left" Margin="12,0,0,238" Name="LockDataGrid" VerticalAlignment="Bottom" Width="554" LoadingRow="LockDataGrid_LoadingRow" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Header="Name" Width="200" Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="ModuleLock" Binding="{Binding ModuleLock}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="StringLock" Binding="{Binding StringLock}"></DataGridTextColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button>Lock module string</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button>Lock strings</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
加载方法:
private void LockDataGrid_Loaded(object sender, RoutedEventArgs e)
{
DataGrid grid = (DataGrid)sender;
}
如何迭代行和单元格?
答案 0 :(得分:1)
我会马上出来说你可能不想走视觉树来实现你的目标(特别是如果它只是用按钮/设置单元格颜色做一些事情)... < / p>
行上的控件将进入和退出,因为数据网格被用户滚动意味着您需要不断监视和更新它(对于少量行,这可能不会发生,但它应该表明这不是处理事情的好方法,但是如果你真的需要走那条路,那么LPL已经与相关的答案挂钩了。)
为了在单击按钮时执行某些操作,您需要在这些按钮上设置命令并将它们绑定在数据模型中;此页面是一个教程应用程序,它描述并显示如何绑定命令MSDN: WPF Apps With The Model-View-ViewModel Design Pattern
然后,您可以使用带有绑定或数据触发器的样式来更改单元格的背景颜色(以及许多其他内容)。我已经敲了一个快速的例子来说明这个实际应用(虽然我没有使用命令绑定这个小例子,但我强烈建议这样做。)
首先,你修改了xaml以具有背景颜色绑定,并且还在按钮上单击ModuleLock时触发一个函数。
<DataGrid SelectionUnit="FullRow" SelectionMode="Single" AutoGenerateColumns="False" Name="LockDataGrid" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Header="Name" Width="200" Binding="{Binding Name}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding CellColor}" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="ModuleLock" Binding="{Binding ModuleLock}"></DataGridTextColumn>
<DataGridTextColumn IsReadOnly="True" Header="StringLock" Binding="{Binding StringLock}"></DataGridTextColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Click="Button_Click">Lock module string</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button>Lock strings</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
接下来代码中的按钮单击处理程序,在这个例子中,我只是将行数据的CellColor属性设置为Red。如上所述,可以为按钮设置一个命令,该命令可以配置得更加相关(例如,命令参数可以设置为DataContext,在默认情况下,它将是行的数据)。
private void Button_Click(object sender, RoutedEventArgs e)
{
var lockModuleButton = sender as Button;
if (lockModuleButton == null)
{
return;
}
var theRowData = lockModuleButton.DataContext as Class1;
if (theRowData == null)
{
return;
}
theRowData.CellColor = "Red";
}
最后一个重要部分 - 数据类(我创建了CellColor属性)将需要通知属性更改,以便绑定更新INotifyPropertyChanged(另请注意我只是设置了CellColor在更改时更新绑定):
using System.ComponentModel;
namespace WpfApplication7
{
class Class1 : INotifyPropertyChanged
{
private string cellColor;
public string CellColor
{
get
{
return cellColor;
}
set
{
cellColor = value;
OnPropertyChanged("CellColor");
}
}
public bool ModuleLock { get; set; }
public bool StringLock { get; set; }
public string Name { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
}
}
}
}
这是窗口打开事件中的快速代码,用于虚拟化一些数据并设置DataGrid的datacontext:
public MainWindow()
{
InitializeComponent();
List<Class1> MyList = new List<Class1>();
MyList.Add(new Class1());
MyList.Add(new Class1());
MyList.Add(new Class1());
MyList.Add(new Class1());
MyList.Add(new Class1());
MyList.Add(new Class1());
LockDataGrid.ItemsSource = MyList;
}
编辑:在构建此内容时,我发现您要解决的实际问题是在按下按钮时锁定对这些字符串字段的访问(可能值得将您的问题更新为如果是这样的话会反映出这种情况,如果是这样的话,如果符合您的需要或者是在正确的轨道上,我会优化这个答案。)
不幸的是,看起来DataGrid并没有很好地设计(无论如何我都能看到) - 但是可以通过使用DataGridTemplateColumn完成 列中包含以下内容:
<DataGridTemplateColumn Header="ModuleLock">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="IsEditing" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Background="{Binding CellColor}" Text="{Binding ModuleLock}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Background="{Binding CellColor}" BorderThickness="0" IsReadOnly="{Binding ModuleLockFlag}" Text="{Binding ModuleLock}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
样式(LPL将recognise it;)存在,因为鼠标有奇怪的聚焦行为;不幸的是,使用可以找到的标签聚焦时,你会想要一些其他的奇怪行为here: