私はすぐに出てきて、おそらく目標を達成するためにビジュアルツリーをたどりたくないと言います(特に、ボタンで何かをしたり、セルの色を設定したりするだけの場合)...
データグリッドがユーザーによってスクロールされると、行のコントロールが存在したり消えたりします。これは、これを常に監視および更新する必要があることを意味します (少数の行の場合、これはおそらく発生しませんが、そうではないことを示す必要があります。物事にアプローチする良い方法ですが、LPLは、本当にそのルートに進む必要がある場合は、そのための関連する回答にリンクしています)。
ボタンがクリックされたときに何かを行うには、それらのボタンにコマンドを設定し、データ モデルにバインドする必要があります。このページは、コマンドをバインドする方法を説明および示すチュートリアル アプリケーションです。MSDN: Model-View-ViewModel デザイン パターンを使用した WPF アプリ
その後、バインドまたはデータトリガーでスタイルを使用して、セルの背景色を変更できます (他の多くのものの中でも特に)。これを実際に実行するための簡単な例をまとめました (ただし、この小さな例ではコマンド バインディングを使用していませんが、使用することを強くお勧めします)。
まず、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";
}
最後に 1 つの重要な部分 - データ クラス (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はそれを認識します;)は、マウスで奇妙なフォーカス動作があるためです。残念ながら、ここで見つけることができるタブフォーカスを使用すると、少し奇妙な動作のために何か他のものが必要になります: