【问题标题】:WPF listview change observable collection properties with button inside ListView ItemWPF listview 使用 ListView 项内的按钮更改可观察的集合属性
【发布时间】:2015-11-01 18:11:46
【问题描述】:

我正在使用在 XAML 中绑定到 Observable 集合的 WPF 列表视图。下面是我的列表视图项目模板,它生成类似的视图

ListView Item looks like this

<DataTemplate x:Key="ImageOverlayAlbumDataTemplate">
  <Grid>
      <Grid Margin="5,5,5,5">
        <Border BorderBrush="LightGray" BorderThickness="1">
        <StackPanel  Orientation="Vertical" Background="White" Height="50" Width="240" VerticalAlignment="Center">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition  />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition  />
                                    <RowDefinition  />
                                </Grid.RowDefinitions>

                            <Border Name="ActionStatusIndicator" Height="50" Width="7" Margin="0" Grid.RowSpan="2">
                                <Border.Style>
                                    <Style TargetType="{x:Type Border}">
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Path=statusid}" Value="3">
                                                <Setter Property="Background" Value="SteelBlue"/>
                                            </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=statusid}" Value="4">
                                                <Setter Property="Background" Value="LightGray"/>
                                            </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=statusid}" Value="5">
                                                <Setter Property="Background" Value="Orange"/>
                                            </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=statusid}" Value="6">
                                                <Setter Property="Background" Value="Red"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Style>

                            </Border>
                            <!--</StackPanel>-->
                                <TextBlock  Text="{Binding subject}" Margin="10,0,0,0" Width="230" Height="20" FontSize="13"
                                    TextTrimming="CharacterEllipsis"  HorizontalAlignment="Left" TextAlignment="Left"
                                            Grid.Row="0" Grid.Column="1"/>

                                <TextBlock Text="{Binding Path=displayname}" FontSize="10" Margin="10,3,0,0" Width="110" Height="20" 
                                TextTrimming="CharacterEllipsis"  HorizontalAlignment="Left" TextAlignment="Left"
                                           Grid.Row="1" Grid.Column="1"/>

                                <Image x:Name="sideButton" Source="/Icons/action.png" Width="20" Height="20"  Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" >
                                    <Image.Style>
                                        <Style TargetType="{x:Type Image}">
                                            <Setter Property="Visibility" Value="Hidden" />
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListViewItem}},Path=IsMouseOver}" Value="True">
                                                     <Setter Property="Visibility" Value="Visible" />
                                                </DataTrigger>

                                                <MultiDataTrigger>
                                                    <MultiDataTrigger.Conditions>
                                                        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListViewItem}},Path=IsMouseOver}" Value="True" />
                                                        <Condition Binding="{Binding Path=StatusID}" Value="3" />

                                                    </MultiDataTrigger.Conditions>
                                                    <Setter Property="Visibility" Value="Visible" />
                                                </MultiDataTrigger>

                                            </Style.Triggers>
                                        </Style>
                                    </Image.Style>
                                </Image>

                            </Grid>

                    </StackPanel>
                    </Border>

              </Grid>
            </Grid>
        </DataTemplate>

当用户单击鼠标悬停时出现的图像(勾号)时,我想将“StatusId”更改为其他数字。

StatusID 存在于 ActionView 类中,因为 int 和以上列表绑定到

【问题讨论】:

  • 以上列表绑定到 ObservableCollection。我无法理解如何更改用户单击鼠标悬停图像的 Item 的 StatusId 属性。

标签: c# wpf listview observablecollection


【解决方案1】:

将您的 Image 元素更改为您重新模板化以显示为图像的 Button:

   <Button Width="20" Height="20" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" 
Command={Binding Path=ChangeStatusCommand}>
        <Button.Template>
            <ControlTemplate>
                <Image x:Name="sideButton" Source="/Icons/action.png"    >
...

您可能想将触发器移到模板或按钮...

并且您需要在具有 StatusID 的同一对象中创建一个 ICommand(或实现它的东西)(或者您也可以在其他地方创建它,但是在那个地方您需要对该对象有一个引用具有 StatusID 的) 现在您可以编写 C# 代码来在推送图像时更改 StatusID。 您还需要确保 StatusID 属性使用 INotifyPropertyChange 事件来提醒要更新的 XAML。

【讨论】:

  • 谢谢zwi ...这正是我一直在寻找的。它现在工作正常,我的 Observable 集合保存了更新的值。您能否也分享一些关于如何将这个可观察集合写回 DB 的想法,以便下次再次加载视图时,它将更新数据。
  • 谢谢,只是意识到我在这里使用了错误的昵称/显示名称 :-)(现在更改)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2016-09-17
  • 2011-09-30
相关资源
最近更新 更多