2011-06-29 10 views
1

列値に基づいて行の色を設定しようとしていますが、値コンバータでは他の計算が可能ですが、バインダーやハードコーディングされたColor Value = "Red"に設定されている場合、XAML解析エラーがスローされます。私はこのように実装しています:Silverlight DataGridRowデータグリッドアイテムソースからの列値とバインドに基づく背景色の変更

<sdk:DataGrid ItemsSource="{Binding 
EmailJobs}" 
AutoGenerateColumns="False" 
Height="Auto" 
HorizontalAlignment="Center" 
Name="dgEmailJObs" 
VerticalAlignment="Top" 
Width="Auto"  Grid.Row="2"> 


<sdk:DataGrid.RowStyle> 
       <Style TargetType="sdk:DataGridRow"> 
        <Style.Setters> 
          <Setter Property="Background" 
Value="{Binding Path=Status, 
Converter={StaticResource 
valueConverter}}"/> 
        </Style.Setters> 
       </Style> 
      </sdk:DataGrid.RowStyle> 
      <sdk:DataGrid.Columns> 
       <sdk:DataGridTextColumn 
CanUserReorder="False" 
CanUserResize="False" 
CanUserSort="True" Header="Customer" 
Width="Auto" Binding="{Binding 
Customer}" /> 
       <sdk:DataGridTextColumn 
CanUserReorder="False" 
CanUserResize="False" 
CanUserSort="True" Header="Program" 
Width="Auto" Binding="{Binding 
Program}" /> 
       <sdk:DataGridTextColumn 
CanUserReorder="False" 
CanUserResize="False" 
CanUserSort="True" 
Header="Application" Width="Auto" 
Binding="{Binding Application}"/> 
       <sdk:DataGridTextColumn 
CanUserReorder="True" 
CanUserResize="False" 
CanUserSort="True" Header="Status" 
Width="Auto" Binding="{Binding 
Status}"></sdk:DataGridTextColumn> 
       <sdk:DataGridTextColumn 
CanUserReorder="False" 
CanUserResize="False" 
CanUserSort="True" Header="Last 
Created By" Width="Auto" 
Binding="{Binding LastChangedBy}"/> 
       <sdk:DataGridTextColumn 
CanUserReorder="False" 
CanUserResize="False" 
CanUserSort="True" Header="Last 
Created On" Width="Auto" 
          Binding="{Binding 
LastChangedOn,StringFormat='MM/DD/YYYY 
hh:mm tt'}" /> 
      </sdk:DataGrid.Columns>      
     </sdk:DataGrid> 

私はMVVMを使用しており、トリガーイベントを使用したくありません。私が欲しいのは、単にコンバータに4番目の列の値を供給することですが、それは、最大吹く、XAMLバインディング知識の非常に単純jsut不足でなければなりません:(任意の助け

+0

ホイアンカジ、できたあなたのp ostエラーメッセージ、およびあなたのコンバータのコード? – Slyvain

+0

エラーは一般的なxaml解析エラーに過ぎず、詳細はありません。エラーは私が値= "{バインディングパス=ステータス、コンバータ= {StaticResource valueConverter}}"を宣言する行が発生します、値コンバータはこのようにかなり簡単です – Kazi

答えて

0

私の値コンバータ:

public class EmailJobStatusConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (value.ToString()=="Stopped") ? 
       new SolidColorBrush(Colors.Red) : 
       new SolidColorBrush(Colors.Green); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     SolidColorBrush resultColor = value as SolidColorBrush; 

     if (resultColor.Color == Colors.Green) 
     { 
      return "Green"; 
     } 
     else 
      return "Red"; 
    } 
} 
2

I Silverlightの4は、セッターに(もう)バインディングを許可していません...私が見ると思う

しかし、あなたの問題を解決するために2つのシンプルなソリューションがあります:。

  • あなたは目を削除することができます電子<sdk:DataGrid.RowStyle>とその内容とあなたのデータグリッドのプロパティとしてRowStyle="{Binding Path=Status, Converter={StaticResource valueConverter}}"でそれを置き換える(以下の例)

    <sdk:DataGrid Grid.Column="1" ItemsSource="{Binding EmailJobs}" RowStyle="{Binding Path=Status, Converter={StaticResource valueConverter}}" AutoGenerateColumns="False" HorizontalAlignment="Center" Name="dgEmailJObs" Width="Auto" Margin="0,0,0,87" LoadingRow="dgEmailJObs_LoadingRow">

それとも、あなたがイベントLoadingRowをトリガーした後の背後にあるコードでそれを管理することができます。

助け
void dgEmailJObs_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    myClass c = e.Row.DataContext as myClass; 
    if (c != null) 
    { 
     if (c.Status == "Stopped") 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
     } 
     else 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Green); 
     } 
    } 
} 

希望;)

+0

感謝Slyvain、しかし、また何のエラーも与えません。 – Kazi

+0

実際には私が出力を取得したときにプロパティを見つけられません:BindingExpression path error: 'Status'プロパティが 'xyMM.EmailStartStop.ViewModel.EmailJobControlViewModel'に見つかりません。ステータスはコレクション内に入るcoustomオブジェクトのプロパティですビューモデルからDataGridのitemsourceにバインドするプロパティEmailJobsのパスをここでどのように記述できますか? – Kazi

+1

実際、テスト後、RowStyleのソリューションは動作しません。しかし、LoadingRowイベントのソリューションは正常に動作します。あなたのコードとの違いを知りたいのであれば、私は少しのアプリを作った:http://www.megaupload.com/?d=VBD53B6K – Slyvain

1
private void grdPendingRequest_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    string changedColPath = string.Empty; 
    dynamic itemData = (dynamic)e.Row.DataContext; 
    if (itemData != null) 
     changedColPath = itemData.Changed_Field; 

    if (changedColPath != string.Empty) 
    { 
     string colPath; 
     System.Windows.Data.Binding binding; 
     string[] ChangedColNameList = null; 

     foreach (DataGridColumn col in grdPendingRequest.Columns) 
     { 
      if (col is DataGridBoundColumn) 
      { 
       binding = (col as DataGridBoundColumn).Binding; 
       colPath = binding.Path.Path; 
       ChangedColNameList = changedColPath.Split(';'); 

       if (ChangedColNameList.Contains(colPath)) 
       { 
        FrameworkElement felt = col.GetCellContent(e.Row); 
        FrameworkElement felt_result = GetParent(felt, typeof(DataGridCell)); 
        if (felt_result != null) 
        { 
         DataGridCell cell = (DataGridCell)felt_result; 
         //cell.Background = new SolidColorBrush(Color.FromArgb(255, 196, 219, 249)); 
         cell.Background = new SolidColorBrush(Colors.Red); 
        } 
       } 
      } 
     } 
    } 
} 
+0

いくつかの説明はいいだろう –

関連する問題