XamOrgChart でデータの値に応じてノードの書式を変えるには、NodeControlAttachedEvent イベントでノードのデータを判定し、OrgChartNode.Style プロパティにスタイルを割り当てます。XamOrgChart のノードは XAML には公開されない OrgChartNode オブジェクトとして表現されるため、DataTrigger などの XAML ではなく、コードで条件付き書式を実装する必要があります。この記事では、組織図の各マネージャーについて直属の部下の人数(管理限界・Span of Control)がしきい値を超えていないかを判定し、超過しているノードを警告色でハイライトする例を紹介します。

XamOrgChart の設定

通常のノード用と、しきい値を超過したノード用に、OrgChartNodeControl を対象とした 2 つのスタイルをリソースとして定義します。XamOrgChart には NodeControlAttachedEvent イベントのハンドラーを設定します。

<Window.Resources>
    <Style x:Key="NormalNodeStyle" TargetType="ig:OrgChartNodeControl">
        <Setter Property="Background" Value="#FFEFEFEF" />
        <Setter Property="BorderBrush" Value="#FFB0B0B0" />
        <Setter Property="BorderThickness" Value="1" />
    </Style>
    <Style x:Key="OverloadedManagerNodeStyle" TargetType="ig:OrgChartNodeControl">
        <Setter Property="Background" Value="#FFFDE0DE" />
        <Setter Property="BorderBrush" Value="#FFE74C3C" />
        <Setter Property="BorderThickness" Value="2" />
    </Style>
</Window.Resources>

<ig:XamOrgChart x:Name="OrgChart"
                ItemsSource="{Binding RootEmployees}"
                ...
                NodeControlAttachedEvent="OrgChart_NodeControlAttachedEvent">
    <ig:XamOrgChart.GlobalNodeLayouts>
        <ig:OrgChartNodeLayout TargetTypeName="Employee"
                               Key="DirectReports" ... />
    </ig:XamOrgChart.GlobalNodeLayouts>
</ig:XamOrgChart>

NodeControlAttachedEvent の処理

NodeControlAttachedEvent イベントは、ノードのコントロールがアタッチされるたびに発生します。イベント引数の e.Node.Node で対象の OrgChartNode を取得し、OrgChartNode.Data からバインドされているデータ(ここでは社員データ)を参照します。直属の部下の人数(DirectReports.Count)をしきい値と比較し、その結果に応じて OrgChartNode.Style に警告用または通常のスタイルを割り当てます。

private int _threshold = 3;

private void OrgChart_NodeControlAttachedEvent(object sender, OrgChartNodeEventArgs e)
{
    ApplyStyle(e.Node.Node);
}

private void ApplyStyle(OrgChartNode node)
{
    if (node.Data is not Employee employee)
    {
        return;
    }

    node.Style = employee.DirectReports.Count > _threshold
        ? (Style)Resources["OverloadedManagerNodeStyle"]
        : (Style)Resources["NormalNodeStyle"];
}

しきい値を変更したときの再判定

しきい値を変更した場合は、ItemsSource をいったん null にしてから再設定します。これでツリー全体が作り直され、ルートを含むすべてのノードで NodeControlAttachedEvent イベントが再び発生して、新しいしきい値で判定し直されます。ただし、ツリーが作り直されるため、ユーザーが個別に展開・折りたたみしていた状態はリセットされます。

private void ApplyThresholdButton_Click(object sender, RoutedEventArgs e)
{
    if (!int.TryParse(ThresholdTextBox.Text, out var threshold) || threshold < 0) { ... }

    _threshold = threshold;

    var items = OrgChart.ItemsSource;
    OrgChart.ItemsSource = null;
    OrgChart.ItemsSource = items;
}

実行結果

直属の部下の人数がしきい値(初期値 3 名)を超えるマネージャーのノードが、警告色(薄い赤の背景と赤い枠線)でハイライトされます。画面下部でしきい値を変更して「しきい値を適用」ボタンをクリックすると、新しいしきい値で判定し直されます。

Tagged:

製品について

Ultimate UI for WPF