2017-01-04 2 views
0

私はこのようなデータグリッドにバインドされたコンピュータ名を持つSQLデータベースがあります:あなたがクリックしたときにC#のWPFのデータグリッド:プログラムでバインドされた列に映像ソースを変更

   <Grid.Resources> 
      <ResourceDictionary> 
       <local:FileIconConverter2 x:Key="FileIconConverter2"/> 
       <BitmapImage x:Key="Image-Unknown" UriSource="../Images/Status-Unknown.ico" /> 
       <BitmapImage x:Key="Image-Good" UriSource="../Images/Status-Good.ico" /> 
      </ResourceDictionary> 
     </Grid.Resources> 
    <DataGrid Name="datagrid1" AutoGenerateColumns="False" IsReadOnly="True" SelectionChanged="datagrid1_SelectionChanged"> 
<DataGrid.Columns> 
    <DataGridTemplateColumn Header="Status" > 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <Image Source="{StaticResource Image-Unknown}"/> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    <DataGridTextColumn Header="Date d m yyyy" Binding="{Binding 'Date d m yyyy'}"/> 
    <DataGridTextColumn Header="Device Name" Binding="{Binding DeviceName}"/> 
    <DataGridTextColumn Header="OS" Binding="{Binding OS}"/> 
    <DataGridTextColumn Header="OS" Binding="{Binding Model}"/> 
    <DataGridTextColumn Header="EOL" Binding="{Binding DeviceAge}"/> 
    <DataGridTextColumn Header="Location" Binding="{Binding Location}"/> 
    <DataGridTextColumn Header="IP" Binding="{Binding IP}"/> 
    <DataGridTextColumn Header="MAC" Binding="{Binding Mac}"/> 
</DataGrid.Columns> 

私がやろうとしています何がありますステータス列のイメージを更新して、コンピュータがイメージを変更してオンラインになっているかどうかを確認します。 ステータス列はデータベースにありません。 状況欄の内容を変更しようとすると、イメージではなく[アイコン]または[ビットマップ]テキストが表示され、スクロールしてイメージをデフォルトに戻します。

ここには がありますか?

編集: テーブルに100個のエントリを入れることができる場合は、行が選択されているときにのみオンライン状態を確認したいと思う。 myClass.GetCellコードは、このpost.

から来

private void datagrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     DataGrid dataGrid = sender as DataGrid; 
     DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(dataGrid.SelectedIndex); 
     DataGridCell rowColumn = dataGrid.Columns[2].GetCellContent(row).Parent as DataGridCell; 
     string CellValue = ((TextBlock)rowColumn.Content).Text; 
     log.Warn(CellValue); 

     //myclass.GetCell(datagrid1, row.GetIndex(), 0).Content = Properties.Resources.Status_Good; 
     myclass.GetCell(datagrid1, row.GetIndex(), 0).Content = (Bitmap)System.Drawing.Image.FromFile(@".\Images\Status-good.ico"); 

    } 

しかし、あなたはこのスクリーンショットで見ることができるように、私はテキストのみを取得し、:だから私はこのようにDataGrid1にSelectionChangedイベントを使用しようとしています画像ではありません。 Screen Shot

答えて

0

トリガーを画像に追加しようとしましたか?

<DataGridTemplateColumn Header="Status" > 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Image > 
       <Image.Style> 
        <Setter Property="Source" Value="{StaticResource Image-Unknown}"/> 
        <Style.Triggers> 
        <DataTrigger Binding="{Binding YourModelPropertyStatus}" Value="true"> 
          <Setter Property="Source" Value="{StaticResource Image-Good}"/> 
        </DataTrigger> 
        </Style.Triggers> 
       </Image.Style> 
      </Image> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

編集:

ソリューション1(既存のコードに最も近い)

むしろ検索すると(本当に悪い習慣です)の背後にあるコードでセルの内容を編集するよりも、追加したり削除したりしたビジネスモデル(デバイスを表す)を与えるe.AddedItemse.RemovedItemsのようなselectionChangedコールバックによって与えられた引数を使用します。

CheckStatusがオンライン状態を確認する方法であり、(前述のトリガので、アクティブ)偽の真にフラグ YourModelPropertyStatusを設定します
 foreach (var addedItem in e.AddedItems) 
     { 
      var device = (Device) addedItem; 
      device.CheckStatus(); 
     } 
     foreach (var remItem in e.RemovedItems) 
     { 
      var device = (Device)remItem; 
      device.SetToUnknown(); 
     } 

ような何か

ソリューション2(クリーンな方法)

XAMLのトリガーソリューションを維持するために、ベストプラクティスを達成するには、CollectionViewを使用してビューモデルのすべてを管理してデバイスコレクションをラップします。 XAML DataGridでIsSynchronizedToCurrentItem=trueを設定し、ビューモデルでCurrentChangedイベントを購読し、コールバックでCollectionViewのCurrentItemを取得し、ビューモデルまたはデバイスオブジェクトのいずれかになるCheckStatus();を呼び出します。

+0

これは一度にすべての行を更新すると思いますが、ユーザーが行を選択したときにステータスを変更することのみを検討しています。元の投稿を更新して、自分のdatagrid1_SelectionChangedを表示しました –

関連する問題