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); }
}