gpt4 book ai didi

c# - 相当于 Prism ViewModels 中的 WPF DependencyProperties

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:12 24 4
gpt4 key购买 nike

我知道在 WPF 中公开 XAML 中的自定义属性的标准方法是在 View 的代码隐藏中将其定义为 DependencyProperty

但是,这仅适用于 DependencyObject,例如 UserControl。然而,以干净的 Prism 方式,我的代码隐藏(即派生自 UserControl 的类)是空的,我处理我的 View 模型中的所有逻辑,它派生自 BindableBase,它不是 DependencyObject 的子类。

考虑以下 XAML 片段:

<MyNamespace:MyCustomView MyProperty={Binding} />

MyCustomViewModel的核心是

private string myProperty;
public string MyProperty {
get { return myProperty; }
set { SetProperty(ref myProperty, value); }

我对 Prism 还是比较陌生。我该怎么做才能公开在我的 MyCustomViewModel 中定义的 MyProperty,以便我可以使用与上面类似的标记在 XAML 中设置它?


更新

根据 @mm8 的回答和我们在相应评论中的讨论,我开发了一个最小的(非)工作示例,以说明我的想法。先总结一下:

  • 数据模型是对象列表。
  • Shell 必须通过此对象类型的自定义用户控件来显示这些对象中的每一个。

A) 外壳

A.1) XAML

XAML 很简单。

<Window x:Class="MyProject.Views.MainWindow"
Name="MainWindowName"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
xmlns:MyNamespace="clr-namespace:MyProject.Views"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<ItemsControl ItemsSource="{Binding StringCollection, ElementName=MainWindowName}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<MyNamespace:MyUserControl MyTargetProperty="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>

A.2) 代码隐藏

代码隐藏包含数据模型定义;实际上,我当然会在 Models 命名空间中定义它。

using System.Collections;
using System.Windows;

namespace MyProject.Views {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();

StringCollection = new ArrayList();
StringCollection.Add("String 1");
StringCollection.Add("String 2");
StringCollection.Add("String 3");
}

private ArrayList stringCollection;
public ArrayList StringCollection {
get { return stringCollection; }
set { stringCollection = value; }
}
}
}

A.3) 查看模型

View 模型是 Prism 代码模板提供的标准 View 模型。

using Prism.Mvvm;

namespace MyProject.ViewModels {
public class MainWindowViewModel : BindableBase {
private string _title = "Prism Unity Application";
public string Title {
get { return _title; }
set { SetProperty(ref _title, value); }
}

public MainWindowViewModel() {
}
}
}

B) 自定义用户控件

这就是乐趣的开始。最后,我想访问 MyUserControlViewModel 中的 MyTargetProperty,因为我想调用依赖于其他数据处理的复杂程序逻辑模型,因此不应放置在代码隐藏中。

B.1) XAML

非常幼稚;只包含一个标签。

<UserControl x:Class="MyProject.Views.MyUserControl"
Name="UserControlName"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<Label Content="{Binding MyTargetProperty, ElementName=UserControlName}" Background="AliceBlue"/>
</UserControl>

B.2) 代码隐藏

这是我将 target 属性 声明为 DependencyProperty 的地方,正如@mm8 的回答中所建议的那样。

using System.Windows;
using System.Windows.Controls;

namespace MyProject.Views {
/// <summary>
/// Interaction logic for MyUserControl
/// </summary>
public partial class MyUserControl : UserControl {
public MyUserControl() {
InitializeComponent();
}

public static readonly DependencyProperty MyTargetPropertyProperty = DependencyProperty.Register("MyTargetProperty", typeof(string), typeof(MyUserControl));
public string MyTargetProperty {
get { return (string)GetValue(MyTargetPropertyProperty); }
set { SetValue(MyTargetPropertyProperty, value); }
}
}
}

B.3) 查看模型

View 模型定义了源属性

using Prism.Mvvm;

namespace MyProject.ViewModels {
public class MyUserControlViewModel : BindableBase {
public MyUserControlViewModel() {
}

private string mySourceProperty;
public string MySourceProperty {
get { return mySourceProperty; }
set { SetProperty(ref mySourceProperty, value); }
}
}
}

我这辈子都想不出如何访问我在 MyUserControlMainWindowItemTemplate 中设置的值> 的 View 模型。

最佳答案

只有目标( View )属性必须是依赖属性。因此,为了能够将任何 绑定(bind)到这样的属性,它必须是依赖属性,如 MyProperty 在这种情况下:

<MyNamespace:MyCustomView MyProperty="{Binding SourceProperty}" />

View 模型中的 source 属性可能是普通的 CLR 属性:

public string SourceProperty { get; set; }

因此您的 View 模型不必(也不应该!)继承自 DependencyObject,但 View 应该继承。

关于c# - 相当于 Prism ViewModels 中的 WPF DependencyProperties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46044202/

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