2017-11-18 11 views
0

自由な時間にWPFを学ぼうとしていますが、アプリケーションを起動して実行していますが、しばらく私を逃したことの1つは、それらがすべて共有する列の行の値に基づいて、ページに表示される複数のデータグリッドのスタイルを設定します。StaticResourceでページ共有のDataTriggerスタイルコンバータを見つけることができません

目的は、通貨の金額が正であるか負であるかに基づいて、行全体のテキストの色(Foregroundプロパティ)をスタイルできます。

ハードコードされた値のペアに対して、私がこれまで行ってきたことは、True/Falseを返すために必要な比較を行うConverterへの配線です。

これは私がこれまで持っているものです:私はセットアップしようとしています

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Width="*" Binding="{Binding Date}" Header="Date"/> 
     <DataGridTextColumn Width="*" Binding="{Binding Category}" Header="Category"/> 
     <DataGridTextColumn Width="*" Binding="{Binding Amount}" Header="Amount"/> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

特定Pageは、データの異なる順列で、グリッドのこの同じタイプの3異なる時間を持つことになります。グリッド自体は、必要に応じてすべて動作しています。

データグリッドは、このクラスのコレクションに移入され、次のよう

public class TransactionDto 
{ 
    public long Id { get; set; } 
    public decimal Amount { get; set; } 
    public string Category { get; set; } 
    public DateTime Date { get; set; } 
} 

私が設定したコンバータは、次のとおりです。

public class AmountConverter : IValueConverter 
{ 
    private const decimal Threshold = 0.00m; 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (decimal)value >= Threshold; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

しかし、私は間の結合を得るように見えることはできませんデータグリッドの列とこのコンバータが把握したものです。これは私が今まで試したことですが、他のSOの質問やその他の質問に投稿された回答を試してみましたが、それらは全く同じ状況ではなく、自分の状況に適用しようとしていませんでした。ここで結合コンバータ:

<Page.Resources> 
<Style TargetType="DataGridRow"> 
    <Style.Triggers > 
     <DataTrigger Binding="{Binding Amount, RelativeSource={RelativeSource Self}, Converter={StaticResource ResourceKey=AmountConverter}}" Value="False"> 
      <Setter Property="Foreground" Value="Red"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Amount}" Value="-24.71"> 
      <Setter Property="Foreground" Value="Green"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style>   

正の値について同様のものが行ったように-24.71のハードコードされた値を使用してトリガが、正常に動作します。

コードビハインドC#ファイルには、必要な変換タイプとプロパティが含まれています

public AmountConverter AmountConverter { get; set; } = new AmountConverter();

私は取得しています現在の例外は以下の通りです:

System.Windows.Markup.XamlParseException

Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.

私はこの例外を実際に理解しておらず、終了しませんどのように進むか、それが私に何を伝えているのかが問題です。

理想的には、私はこのスタイル設定をApp.xamlに設定し、関連するデータグリッドからそれを参照します。

+0

WPF datagrodを作成する –

答えて

0

私はこの回答をthis articleで見つけました。変更は私のアプリケーションに次のものを追加することでした。その後、関連するデータグリッドのすべてに、アプリケーション全体必要な変更を適用するXAMLファイルは、:

<Application.Resources> 
    <local:AmountConverter x:Key="AmountConverter"/> 
    <Style TargetType="DataGridRow"> 
    <Style.Triggers > 
     <DataTrigger Binding="{Binding Amount, Converter={StaticResource AmountConverter}}" Value="False"> 
      <Setter Property="Foreground" Value="Red"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Amount, Converter={StaticResource AmountConverter}}" Value="True"> 
      <Setter Property="Foreground" Value="Green"/> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style> 
</Application.Resources> 
0

あなたのアプローチが緑または読み取り作るために2つのトリガを使用して複雑なビットである私には思えます。あなたのコンバーターも色を返すことができ、トリガーは必要ありません。

class AmountConverter: IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    if (value is int) { 
     int quantity = (int)value; 
     if (quantity>=100) return Brushes.White; 
     if (quantity>=10) return Brushes.WhiteSmoke; 
     if (quantity>=0) return Brushes.LightGray; 
     return Brushes.White; //quantity should not be below 0 
    } 
    //value is not an integer. Do not throw an exception 
    // in the converter, but return something that is obviously wrong 
    return Brushes.Yellow; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 

WPFデータグリッドを作成することは非常に難しく、Microsoftのマニュアルではその方法を教えてくれません。データグリッドのさまざまな部分を簡単にフォーマットする方法を理解するには、私の記事をお読みくださいCodeProject: Guide to WPF DataGrid formatting using bindings

関連する問題