Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于绑定的xaml术语的差异_C#_.net_Silverlight_Xaml_Mvvm - Fatal编程技术网

C# 用于绑定的xaml术语的差异

C# 用于绑定的xaml术语的差异,c#,.net,silverlight,xaml,mvvm,C#,.net,Silverlight,Xaml,Mvvm,我是使用Silverlight的xaml(用于MVVM方法)的初学者。我读了几份文件,对这一切都有点困惑。如果有人能解释一下以下两者之间的区别,我将不胜感激 假设我的XAML是: xmlns:viewmodel="clr-namespace:smallMVVM" ...... ...... <UserControl.Resources> <viewmodel:ViewModel x:Key="ViewModel"/> &l

我是使用Silverlight的xaml(用于MVVM方法)的初学者。我读了几份文件,对这一切都有点困惑。如果有人能解释一下以下两者之间的区别,我将不胜感激

假设我的XAML是:

  xmlns:viewmodel="clr-namespace:smallMVVM"
  ......
  ......  
 <UserControl.Resources>
        <viewmodel:ViewModel x:Key="ViewModel"/>
        <viewmodel:DatetimeToDateConverter x:Key="MyConverter"/>
 </UserControl.Resources>
xmlns:viewmodel=“clr命名空间:smallMVVM”
......
......  
现在,这两者之间的区别是什么:

  • 我的意思是在MainPage.cs中,如果我执行
    “this.DataContext=newviewmodel();”
    。在MainPage.xaml中执行以下操作。这两者有什么区别吗

  • 在某些示例中,我在某处看到了
    ItemsSource=“{StaticResource customers}”
    ItemSource
    DataContext
    有何不同。然而,我可以在示例
    (1)
    中看到,我在DataContext的绑定中有相同的内容(请参见:
    Source={StaticResource ViewModel}
    ,在
    (2)
    中,它被
    客户
    替换)。两者有什么不同

  • 有时我也直接看到
    ItemsSource=“{Binding Students}”
    里面没有
    StaticResource
    。它与StaticResource有什么不同

  • 一些示例仅包含
    Binding=“{Binding Name}”

  • SelectedItem
    SelectedValue
    有何不同

  • 有人能用一个小而简单的例子来解释吗?在互联网搜索中,有一些典型的例子供初学者理解。

    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告诉您的视图属性已更改,并重新加载属性

    视图:

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

    关于体系结构的说明,如果要构建具有多个视图和视图模型的应用程序,请创建一个ViewModelBase并使其继承DependencyObject并实现INotifyPropertyChanged,那么所有真实视图模型都可以从ViewModelBase继承

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

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

    <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>
    
    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