用于绑定的xaml术语的差异

本文关键字:术语 xaml 绑定 用于 | 更新日期: 2023-09-27 18:12:13

我是使用Silverlight的xaml(用于MVVM APPROACH)的初学者。我读了几份文件,对这一切都有点困惑。如果有人能解释一下下面的区别,我将非常感激。

假设我的XAML是:
  xmlns:viewmodel="clr-namespace:smallMVVM"
  ......
  ......  
 <UserControl.Resources>
        <viewmodel:ViewModel x:Key="ViewModel"/>
        <viewmodel:DatetimeToDateConverter x:Key="MyConverter"/>
 </UserControl.Resources>

的区别是什么?
  1. 我的意思是在MainPage.cs中,如果我做"this.DataContext = new ViewModel();"。在主页中。如果我做下面的<Grid DataContext="{Binding Source={StaticResource ViewModel}}">

  2. 某处我看到ItemsSource="{StaticResource customers}"在一些例子。ItemSourceDataContext有什么不同?然而,我可以在示例(1)中看到,我在DataContext的绑定中具有相同的功能(请参阅:Source={StaticResource ViewModel}(2),它被customers取代)。这两者有什么不同?

  3. 有时我也直接看到ItemsSource="{Binding Students}"里面没有StaticResource。它与StaticResource有什么不同?

  4. 一些例子只是Binding="{Binding Name}" .

  5. SelectedItemSelectedValue有什么不同?

有人可以用一个小而简单的例子来解释它们吗?在互联网上搜索有一个初学者理解的典型例子。

用于绑定的xaml术语的差异

1)从技术上讲,数据上下文的两种声明之间没有区别我喜欢在代码后面这样做,看起来像这样:

Partial Public Class MainPage
    Inherits UserControl
    Private _viewModel As TestViewModel
    Public Sub New()
        InitializeComponent()
        _viewModel = TryCast(Resources("TheViewModel"), TestViewModel)
        Me.DataContext = _viewModel
    End Sub
End Class

2)你不想把ItemsSource设置为静态页面资源,你想把它设置为ViewModel中的属性。下面是一个示例视图和视图模型,请注意VM上的继承和实现,它们允许VM告诉视图属性已经更改,并重新加载属性。

视图:

<UserControl x:Class="SilverlightTestApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:ModelViewModel="clr-namespace:SilverlightTestApp"  >
<UserControl.Resources>
    <ModelViewModel:TestViewModel x:Key="TheViewModel" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheViewModel}">
    <ItemsControl ItemsSource="{Binding SampleCollection}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}"></TextBlock>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

ViewModel:

Imports System.ComponentModel
Imports System.Collections.ObjectModel
Public Class TestViewModel
    Inherits DependencyObject
    Implements System.ComponentModel.INotifyPropertyChanged
    Implements INotifyDataErrorInfo
    Private _model As TestModel
    Sub New()
        Me.New(New TestModel)
    End Sub
    Public Sub New(ByVal model As TestModel)
        _model = model
        _sampleCollection = New ObservableCollection(Of String)
        _sampleCollection.Add("one")
        _sampleCollection.Add("two")
        _sampleCollection.Add("three")
        _sampleCollection.Add("four")
    End Sub
    Private _sampleCollection As ObservableCollection(Of String)
    Public Property SampleCollection As ObservableCollection(Of String)
        Get
            Return _sampleCollection
        End Get
        Set(value As ObservableCollection(Of String))             
            If value IsNot Nothing Then
                _sampleCollection = value
            End If
            Me.OnPropertyChanged("SampleCollection")
        End Set
    End Property
    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    Protected errors As New Dictionary(Of String, List(Of String))
    Protected Sub OnPropertyChanged(ByVal propertyName As String)
        RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
    End Sub
    ' #Region " Validation Plumbing"
    ' Adds the specified error to the errors collection if it is not 
    ' already present, inserting it in the first position if isWarning is 
    ' false. Raises the ErrorsChanged event if the collection changes. 
    Public Sub AddError(ByVal propertyName As String, ByVal [error] As String,
                        ByVal isWarning As Boolean)
        If Not errors.ContainsKey(propertyName) Then _
            errors(propertyName) = New List(Of String)()
        If Not errors(propertyName).Contains([error]) Then
            If isWarning Then
                errors(propertyName).Add([error])
            Else
                errors(propertyName).Insert(0, [error])
            End If
            RaiseErrorsChanged(propertyName)
        End If
    End Sub
    ' Removes the specified error from the errors collection if it is
    ' present. Raises the ErrorsChanged event if the collection changes.
    Public Sub RemoveError(ByVal propertyName As String, ByVal [error] As String)
        If errors.ContainsKey(propertyName) AndAlso
            errors(propertyName).Contains([error]) Then
            errors(propertyName).Remove([error])
            If errors(propertyName).Count = 0 Then errors.Remove(propertyName)
            RaiseErrorsChanged(propertyName)
        End If
    End Sub
    Public Sub RemoveError(ByVal propertyName As String)
        If errors.ContainsKey(propertyName) Then
            errors.Remove(propertyName)
            RaiseErrorsChanged(propertyName)
        End If
    End Sub
    Public Sub RaiseErrorsChanged(ByVal propertyName As String)
        OnPropertyChanged("HasErrors")
        RaiseEvent ErrorsChanged(Me,
            New DataErrorsChangedEventArgs(propertyName))
    End Sub
    Public Event ErrorsChanged As EventHandler(Of DataErrorsChangedEventArgs) _
        Implements INotifyDataErrorInfo.ErrorsChanged
    Public Function GetErrors(ByVal propertyName As String) _
        As System.Collections.IEnumerable _
        Implements INotifyDataErrorInfo.GetErrors
        If (String.IsNullOrEmpty(propertyName) OrElse
            Not errors.ContainsKey(propertyName)) Then Return Nothing
        Return errors(propertyName)
    End Function
    Public ReadOnly Property HasErrors As Boolean _
        Implements INotifyDataErrorInfo.HasErrors
        Get
            Return errors.Count > 0
        End Get
    End Property
End Class

上面的关键部分是Me.OnPropertyChanged("SampleCollection"),它告诉视图更新它所绑定的属性。

关于架构的说明,如果你正在构建一个具有多个视图和视图模型的应用程序,创建一个ViewModelBase并让它继承DependencyObject和实现INotifyPropertyChanged,那么你所有的真实视图模型都可以从ViewModelBase继承。

我还创建了一个在VM中使用的名为TestModel的类,但将其保留为空。模型是你放置代码与数据库对话的地方,或者我所做的,调用与我的数据库对话的WCF服务。

5)最后,SelectedItem是ItemSource中被选中的实际对象,而SelectedValue是SelectedValuePath的值。在上面的示例中,我创建了一个简单的String集合,但是假设您有一个具有多个属性的自定义对象集合,那么您可以指定SelectedValuePath作为这些属性之一。SelectedItem将返回整个对象