2013-02-01 41 views
0

我想在我的數據網格的每一行中添加一個圖標。列是自動生成的,並且我添加了一個包含datagridtemplatecolumn的列,以在第一列顯示圖標。將圖標添加到WPF數據網格中

這是我的XAML代碼顯示的圖標:

<DataGrid ItemsSource="{Binding User.myDataTable}" IsReadOnly="True" FrozenColumnCount="1"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn x:Name="IconHeader" Header="" CanUserResize="False"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Image Source="myImage" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

行之有效。 現在我想更改圖標,如果在行的一列是條件爲真。例如, 。如果第11列的值爲「真」,則圖標1,如果值爲「假」,則圖標2。

我可以使用從datagrid的裝載事件來做到這一點,我怎麼能用mvvm做到這一點?還是有另一種方法來做這樣的事情?

回答

1

在這裏做最簡單的事情是用在你的CellTemplate一個DataTrigger這將觸發基於綁定到列數據:

<DataTemplate> 
    <Image Source="myImage1" x:Name="img" /> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=[11]}" Value="False"> 
      <Setter TargetName="img" Property="Source" Value="myImage2" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

DataRow中既有用於獲取一列int和字符串索引通過索引或名稱,因此對於您的綁定路徑,您可以將[]與列索引([3])或列名稱([MyColumn])一起使用。

+0

我該怎麼做綁定到column11property?我的列是自動生成的 – user2025830

+0

這是一個布爾屬性的佔位符,你想用來確定使用哪個圖像,因爲你的問題沒有顯示任何數據 –

+0

我的數據來自MSSQL Server的存儲過程,在我的模型中,我有一個數據表,由存儲過程填充,這些數據表綁定到datagrid的itemssource。所以我不知道如何做出圖像1或2之間的決定 – user2025830

0

我相信最好的方法是實現一個IValueConverter。如果column11爲true,則顯示一個圖像,如果爲false,則顯示其他圖像。

的IValueConverter:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

喜歡的東西:

public class IconConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    if ((bool)value == true) 
    { 
     // column11 = true, so show icon 1 
     return image1; 
    } 
    else 
    { 
     return image2; 
    } 
    } 
} 
0

這聽起來像一個轉換工作。只要你的圖片的來源,屬性綁定到你想要的屬性:

<Image Source="{Binding Path=BoolProp, Converter={StaticResource BoolToImageConv}}" 

你的轉換可能看起來像

public class BoolToImageConverter:IValueConverter 
{ 
    public string FalsePath { get; set; } 
    public string TruePath { get; set; } 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (System.Convert.ToBoolean(value)) 
     { 
      return new BitmapImage(new Uri(TruePath)); 
     } 
     return new BitmapImage(new Uri(FalsePath)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

在窗口的資源/用戶控件,你必須參考你的轉換器。

<Window.Resources> 
    <conv:BoolToImageConverter FalsePath="pathforimageiffalse" TruePath="pathforimageiftrue" x:Key="BoolToImageConv"/> 
</Window.Resources> 
+0

你能告訴我如何在我的窗口中添加xmlns命名空間嗎? – user2025830

+0

當然:'xmlns:conv =「clr-namespace:ApplicationName.FolderName」'如果它在另一個Assembly中:'xmlns:conv =「clr-namespace:ApllicationName.FolderName; assembly = AssemblyName」'類型xmlns:conv =「和intellisense應該做的其餘^^ –

+0

抱歉,但我必須再次問:我在文件夾轉換器中添加了類BoolToImageConverter現在我已添加到命名空間xmlns:conv =」clr-namespace: WPF.Converter「,但是conv:BoolToImageConverter不在命名空間中,怎麼回事? – user2025830

相關問題