实际上构成了什么'改变了#39;就ItemsSource属性而言

时间:2015-11-15 12:36:48

标签: wpf vb.net xaml mvvm custom-controls

我有一个自定义控件,它继承自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更改事件。

我怀疑我错过了一些非常明显的东西,但我不确定是什么。

1 个答案:

答案 0 :(得分:1)

绑定可观察集合后,不应创建新集合或更改可观察集合并期望绑定起作用。最好的建议是清除可观察集合中的项目,并将新的可观察集合中的项目添加到绑定的可观察集合中。