【问题标题】:Dynamically set a property in an Item Template在项目模板中动态设置属性
【发布时间】:2013-10-06 00:42:22
【问题描述】:

我使用以下资源在 GroupItem 中使用的 StackPanel 中设置了图像的图像路径(效果很好):

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander Name="expander" IsExpanded="True" >
                    <Expander.Header>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="pack://application:,,,/Resources/History.ico" Margin="2,0"  
                                   Width="18" Height="18" ></Image>
                            <TextBlock Text="{Binding Name}" Padding="2,0"/>
                        </StackPanel>
                    </Expander.Header>
                    <ItemsPresenter />
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在此 DataGrid 中使用:

    <DataGrid Name="JobHistory" CanUserAddRows="False" AutoGenerateColumns="False" ColumnWidth="*"
              CanUserDeleteRows="False" ItemsSource="{Binding}" Grid.Row="2" 
              Grid.ColumnSpan="5" CanUserResizeRows="False" 
              Grid.RowSpan="2" IsTextSearchEnabled="True" VerticalScrollBarVisibility="Visible"  >
        <DataGrid.GroupStyle>
            <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <DataGridRowsPresenter/>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
            </GroupStyle>
        </DataGrid.GroupStyle>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Status" Width="Auto" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding ResultImagePath}" Height="18" Width="18"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Job description" Binding="{Binding JobDescription}"/>
        </DataGrid.Columns>
    </DataGrid>

DataView 通过以下代码进行分组:

    ListCollectionView collection = new ListCollectionView(JobData);
    collection.GroupDescriptions.Add(new PropertyGroupDescription("Name"));
    JobHistory.ItemsSource = collection;

我的问题:如何在 StackPanel 中动态设置图片来源?

<StackPanel Orientation="Horizontal">
  <Image Source="pack://application:,,,/Resources/History.ico" Margin="2,0"  
     Width="18" Height="18" ></Image>
  <TextBlock Text="{Binding Name}" Padding="2,0"/>
</StackPanel>

编辑 1: 使用:

<UserControl.Resources>
            <Image x:Key="image" Source="pack://application:,,,/Resources/History.ico" Height="18" Width="18" Margin="2,0"/>
</UserControl.Resources>


<StackPanel Orientation="Horizontal">
    <ContentControl Content="{StaticResource ResourceKey=image}"/>
      Width="18" Height="18" ></Image>
    <TextBlock Text="{Binding Name}" Padding="2,0"/>
</StackPanel>

作为 user2760623 建议的作品。

我的问题仍然存在。在任何给定时间,我都有多行按“名称”分组。也可以有几个不同的组。根据作业当前状态,我想更改 GroupItem 标题中的图像。那么如何确定哪个标头是“正确的”标头,以及如何准确地操作那个单个标头?

【问题讨论】:

    标签: wpf datagrid listcollectionview


    【解决方案1】:

    把图片源作为动态资源,然后就可以改了。只需执行以下操作:

    1. 定义命名空间 - xmlns:clr="clr-namespace:System;assembly=mscorlib"
    2. 添加为资源 - &lt;clr:String x:Key="imageSource" &gt;the path...&lt;/clr:String&gt;
    3. 还有图片本身 - &lt;Image Source="{DynamicResource ResourceKey=imageSource}"
    4. 当你想改变它时 - this.Resources["imageSource"] = "another path..."

    您也可以执行相同的概念,只需将整个图像作为资源(而不仅仅是图像路径),而不需要添加命名空间(上面的数字 1)。并将其作为 ContentControl 的内容 - &lt;ContentControl Content="{StaticResource ResourceKey=image}"/&gt;.

    【讨论】:

    • 我遇到了一个错误。我将xmlns:clr="clr-namespace:System;assembly=mscorlib" 添加到我的&lt;UserControl x:Class...&gt; 并将&lt;clr:String x:Key="imageSource"&gt;pack://application:,,,/Resources/History.ico&lt;/clr:String&gt; 添加到&lt;UserControl.Resources&gt;。然后设置&lt;Image Source="{DynamicResource ResourceKey=imageSource}" Margin="2,0"。现在我收到错误 51 - “System.String”类型的对象无法应用于需要“System.Windows.Media.ImageSource”类型的属性。有什么想法吗?
    • 我的错误。我想你不能只把一个字符串资源作为一个 ImageSource。无论如何,您可以使用我提到的另一个选项 - 将整个图像作为资源。
    • 正如我所写,将(资源是一个)图像作为 ContentControl 的内容。
    • 没有。那也不行。 &lt;Image&gt; &lt;ContentControl Content="{StaticResource ResourceKey=image}"/&gt; &lt;/Image&gt; 导致以下错误:“图像”类型不支持直接内容无法将内容添加到“图像”类型的对象
    • 我只提到了 ContentControl,没有围绕它的 标签。
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多