gpt4 book ai didi

c# - 如何使用 MVVM WPF 架构创建自定义用户控件

转载 作者:行者123 更新时间:2023-12-03 10:43:47 24 4
gpt4 key购买 nike

是否可以创建具有尊重 MVVM WPF 模式的依赖项属性的自定义控件?

如果是,您如何在另一个 MVVM 应用程序中使用 CustomControl 并公开依赖项属性?

编辑:

下面是一个允许我创建 customControl 的简单示例,然后我在另一个名为“TestCustomControl”的 WPF 应用程序中使用它。但是,依赖属性对我来说根本不起作用。

enter image description here

CustomControlView.xaml

<UserControl xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"  xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"  x:Class="MyCustomControl.MyCustomUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
xmlns:myCustomControl="clr-namespace:MyCustomControl"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">

<dxmvvm:Interaction.Triggers>
<dxmvvm:EventToCommand Command="{Binding LoadCommand}" EventName="Loaded" />
</dxmvvm:Interaction.Triggers>

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<dxe:ButtonEdit Height="40" Grid.Row="0"/>
<dxg:GridControl Grid.Row="1" ItemsSource="{Binding MyItems}" AutoGenerateColumns="AddNew"/>
</Grid>

CustomControlView.xaml.cs
using System.Windows;
using System.Windows.Controls;
namespace MyCustomControl
{
/// <summary>
/// Interaction logic for MyCustomUserControl.xaml
/// </summary>
public partial class MyCustomUserControl : UserControl
{
public MyCustomUserControl()
{
InitializeComponent();
this.DataContext = new CustomControlViewModel(FilePath);
}
/// <summary>
/// File Path
/// </summary>
public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register(
"FilePath", typeof(string), typeof(MyCustomUserControl), new PropertyMetadata(string.Empty));
public string FilePath
{
get { return (string)GetValue(FilePathProperty); }
set
{
SetValue(FilePathProperty, value);
}
}
}
}

CustomControlViewModel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using DevExpress.Mvvm;
using DevExpress.Mvvm.DataAnnotations;
namespace MyCustomControl
{
public class CustomControlViewModel:ViewModelBase
{
#region Fields
private ObservableCollection<string> _myItems;
private string _path;
#endregion

#region Constructors
public CustomControlViewModel(string path)
{
_path = path;
}
#endregion

#region Commands

[Command]
public void Load()
{
IEnumerable<string> allLinesText = new List<string>();
try
{
allLinesText = File.ReadAllLines(_path).ToList();
}
catch (Exception e)
{

Console.WriteLine(e.ToString());
}

MyItems = new ObservableCollection<string>(allLinesText);
}
#endregion

#region Properties
public ObservableCollection<string> MyItems
{
get { return _myItems; }
set { SetProperty(ref _myItems, value, () => MyItems); }
}
#endregion
}
}

主窗口.xaml
<Window xmlns:MyCustomControl="clr-namespace:MyCustomControl;assembly=MyCustomControl"  
x:Class="TestCustomControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:testCustomControl="clr-namespace:TestCustomControl"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<testCustomControl:MainViewModel/>
</Window.DataContext>
<Grid>
<MyCustomControl:MyCustomUserControl FilePath="{Binding MyFile}"/>
</Grid>

主视图模型.cs
using DevExpress.Mvvm;
namespace TestCustomControl
{
public class MainViewModel: ViewModelBase
{
#region Fields
private string _myFile;
#endregion

#region Constructors
public MainViewModel()
{
MyFile = "List.txt";
}
#endregion

#region Properties
public string MyFile
{
get { return _myFile; }
set { SetProperty(ref _myFile, value, () => MyFile); }
}
#endregion
}
}

注意: “List.txt”是放置在“..\TestCustomControl\bin\Debug”中的文件

有人可以帮我找出为什么我的依赖属性不起作用吗?

最佳答案

这显然是可能的,并且是创建自定义控件的最佳方式。因为没有依赖属性,我们不能轻易地重用自定义控件。使用依赖属性,可重用性变得非常容易。您可以使用 指挥作为依赖属性,因此遵循 MVVM 模式并具有更清晰的代码。

如果我详细说明如何在另一个 MVVM 应用程序中重用 CustomControl,那么这里就无法回答了。你可以去 Visual Studio 并创建一个自定义控件。在后面的代码中定义了一些依赖属性,这些依赖属性绑定(bind)到 View 中您认为是动态的属性。在另一个应用程序中重用这个非常自定义的控件,并在重用它的同时设置这些属性。

您也可以尝试使用 指挥用于将某些事件路由到 View 模型。即列表项选择更改事件的依赖属性可以将命令路由到相应的 View 模型。

关于c# - 如何使用 MVVM WPF 架构创建自定义用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38251198/

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