gpt4 book ai didi

c# - 用于绑定(bind)的 xaml 术语的差异

转载 作者:太空狗 更新时间:2023-10-29 23:45:34 25 4
gpt4 key购买 nike

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

假设我的 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();" .在 MainPage.xaml 中,如果我执行以下操作 <Grid DataContext="{Binding Source={StaticResource ViewModel}}"> .两者有什么区别吗?

  2. 我在某处看到了 ItemsSource="{StaticResource customers}"在一些例子中。 ItemSource如何不同于DataContext .而我可以在示例中看到 (1)我在 DataContext 的绑定(bind)中有相同的内容(请看这个:Source={StaticResource ViewModel} 并且在 (2) 中它被替换为 customers )。两者有何不同?

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

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

  5. 怎么样SelectedItemSelectedValue不一样?

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

最佳答案

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 中的属性。下面是一个示例 View 和 ViewModel,请注意 VM 上的 Inherits 和 Impelments,它们允许您的 VM 告诉您的 View 属性已更改,并重新加载该属性。

查看:

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

View 模型:

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"),它告诉 View 更新它绑定(bind)的属性。

关于架构的注意事项,如果您正在构建具有多个 View 和 ViewModel 的应用程序,创建一个 ViewModelBase 并让它继承 DependencyObject 并实现 INotifyPropertyChanged,那么您所有的真实 View 模型都可以从 ViewModelBase 继承。

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

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

关于c# - 用于绑定(bind)的 xaml 术语的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24673167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com