C# 已更改属性上的刷新ListView项

C# 已更改属性上的刷新ListView项,c#,wpf,listview,C#,Wpf,Listview,我有这样一个列表视图: <ListView Grid.Row="1" x:Name="itemsListView" BorderBrush="White" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=ActualItem}"> <ListView.View>

我有这样一个列表视图:

<ListView Grid.Row="1" x:Name="itemsListView" 
          BorderBrush="White" HorizontalAlignment="Stretch"
          ItemsSource="{Binding Path=Items}"
          SelectedItem="{Binding Path=ActualItem}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="{x:Static p:Resources.STATUS}">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <local:StatusElement State="{Binding Path=Status,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
                                                Height="20"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn Header="{x:Static p:Resources.NAME}"
                            DisplayMemberBinding="{Binding Path=Name,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/>
        </GridView>
    </ListView.View>
</ListView>
以及:


为什么my statusLabel的内容没有刷新?

您的类没有实现该事件。实现它以实现更新

通知客户端属性值已更改


您的类没有实现该事件。实现它以实现更新

通知客户端属性值已更改


您对
状态
依赖项属性的定义是错误的

它必须如下所示,其中CLR属性包装器必须调用拥有该属性的DependencyObject的
GetValue
SetValue
方法

public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
     "State",
     typeof(string),
     typeof(StatusElement),
     new PropertyMetadata(null, (o, e) => ((StatusElement)o).RefreshState()));

public string State
{
    get { return (string)GetValue(StateProperty); }
    set { SetValue(StateProperty, value); }
}

请注意
PropertyMetadata
构造函数的第二个参数。它是一个静态的
属性ChangedCallback
,实现为lambda表达式。

您对
状态
依赖属性的定义是错误的

它必须如下所示,其中CLR属性包装器必须调用拥有该属性的DependencyObject的
GetValue
SetValue
方法

public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
     "State",
     typeof(string),
     typeof(StatusElement),
     new PropertyMetadata(null, (o, e) => ((StatusElement)o).RefreshState()));

public string State
{
    get { return (string)GetValue(StateProperty); }
    set { SetValue(StateProperty, value); }
}

请注意
PropertyMetadata
构造函数的第二个参数。它是一个静态的
PropertyChangedCallback
,作为lambda表达式实现。

请注意,
UpdateSourceTrigger=PropertyChanged
在单向绑定中没有任何效果(因为从目标到源没有数据流)。除此之外,显式设置
Mode=OneWay
通常是多余的,因为这已经是大多数依赖属性的默认设置。请注意,
UpdateSourceTrigger=PropertyChanged
在单向绑定中不起作用(因为没有从目标到源的数据流)。除此之外,显式设置
Mode=OneWay
通常是多余的,因为这已经是大多数依赖项属性的默认设置。通常不需要在UserControl中实现INotifyPropertyChanged,因为属性通常定义为依赖项属性,它已经有了一个内置的更改通知机制。有没有一个教程我可以查看这个?谷歌“wpf自定义依赖属性”。我尝试了这个,但没有改变。我的问题是,当列表中某个项目的状态发生更改时,
Items
(ObservableCollection),它不会更新
StatusElement
上的值。我的意思是,我在
公共字符串状态{set…}
上定义了一个断点,当
项的值更改时。状态
代码不执行集合通常不需要在UserControl中实现INotifyPropertyChanged,因为属性通常定义为依赖属性,它已经有了一个内置的更改通知机制。有没有一个教程我可以查看这个?谷歌“wpf自定义依赖属性”。我尝试了这个,但没有改变。我的问题是,当列表中某个项目的状态发生更改时,
Items
(ObservableCollection),它不会更新
StatusElement
上的值。我的意思是,我在
公共字符串状态{set…}
上定义了一个断点,当
项的值更改时,状态
代码不执行该集
public partial class StatusElement : UserControl,INotifyPropertyChanged
{
 ....

public event PropertyChangedEventHandler PropertyChanged;

private void RefreshState([CallerMemberName]string prop = "")
{
    switch (State)
    {
        case "":
            MyImage.Visibility = Visibility.Hidden;
            break;
        default:
            MyImage.Visibility = Visibility.Visible;
            break;
    }
    statusLabel.Content = State;
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(prop));

    }
}
} 
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
     "State",
     typeof(string),
     typeof(StatusElement),
     new PropertyMetadata(null, (o, e) => ((StatusElement)o).RefreshState()));

public string State
{
    get { return (string)GetValue(StateProperty); }
    set { SetValue(StateProperty, value); }
}