我有一个自定义控件,它继承自ItemsControl,因此有一个ItemsSource属性。在控件中我想知道itemsSource何时更改,所以我在控件代码文件中有以下代码:
Shared Sub New()
DefaultStyleKeyProperty.OverrideMetadata(GetType(VtlDataNavigator), New FrameworkPropertyMetadata(GetType(VtlDataNavigator)))
ItemsSourceProperty.OverrideMetadata(GetType(VtlDataNavigator), New FrameworkPropertyMetadata(Nothing, AddressOf OnItemsSourceHasChanged))
End Sub
当我将控件添加到我的测试应用程序中的表单时,我将像这样绑定ItemsSource:
<Grid>
<StackPanel Margin="4"
Orientation="Vertical">
<WpfControls:VtlDataNavigator x:Name="MyDataNavigator" ItemsSource="{Binding Path=Orders,Mode=TwoWay}" />
</StackPanel>
</Grid>
在链接到该视图的代码中,我设置了Orders属性,如下所示:
Class MainWindow
Implements INotifyPropertyChanged
Public Sub New()
InitializeComponent
Orders = Context.OrdersList
End Sub
Private _orders As C1.Data.ClientView(of OrderHeader)
Public Property Orders As C1.Data.ClientView(of OrderHeader)
Get
Return _orders
End Get
Set(ByVal Value As C1.Data.ClientView(of OrderHeader))
If (_orders Is Value) Then Return
_orders = Value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Orders)))
End Set
End Property
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
'Orders = Context.OrdersList
'With MyDataNavigator
' .ItemsSource = Orders
'End With
End Sub
End Class
现在我的困境,以及我不太明白的原因是为什么当在构造函数或加载阶段(并且在任何时候提升Orders已更改事件)专门设置orders属性时,它不是触发ItemsSource Changed事件。但是,我可以在构造函数中设置Orders属性,并在加载的事件中运行代码,该事件专门重置&#39; (我在那里选择了单词)ItemsSource属性和lo,并且看到更改的项目源被触发。
我已尝试在xaml中没有设置模式,Mode = Oneway和Mode = Twoway后者我在上面所示的代码中留下了但是这似乎没有区别。
我希望自己和其他人可以在一个合适的mvvm场景中使用这个控件,实际上唯一的绑定很可能是在xaml中我认为如果它绑定到Orders和订单更改然后将触发ItemsSource更改事件。
我怀疑我错过了一些非常明显的东西,但我不确定是什么。
答案 0 :(得分:1)
绑定可观察集合后,不应创建新集合或更改可观察集合并期望绑定起作用。最好的建议是清除可观察集合中的项目,并将新的可观察集合中的项目添加到绑定的可观察集合中。