gpt4 book ai didi

c# - 如何绑定(bind)自定义依赖属性来控制 View 模型?

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

我需要创建一个输入/输出很少但内部功能很多的控件。我认为最好的方法是创建用于与其他应用程序部分交互的 Dependency Properties 并拥有一个带有隐藏功能的 private view model

这是我的示例:

窗口

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:WpfApplication1">
<StackPanel>
<DatePicker x:Name="DatePicker" />
<app:MyControl DateCtrl="{Binding ElementName=DatePicker, Path=SelectedDate}" />
</StackPanel>
</Window>

我的控件

<UserControl x:Class="WpfApplication1.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:WpfApplication1">
<UserControl.DataContext>
<app:ViewModel />
</UserControl.DataContext>
<Grid>
<TextBlock Text="{Binding DateVM}" />
</Grid>
</UserControl>

控制代码隐藏

using System;
using System.Windows;

namespace WpfApplication1
{
public partial class MyControl
{
public MyControl()
{
InitializeComponent();
}

public static DependencyProperty DateCtrlProperty = DependencyProperty.Register("DateCtrl", typeof(DateTime), typeof(MyControl));
public DateTime DateCtrl
{
get { return (DateTime) GetValue(DateCtrlProperty); }
set { SetValue(DateCtrlProperty, value); }
}
}
}

View 模型

using System;
using System.ComponentModel;

namespace WpfApplication1
{
public class ViewModel : INotifyPropertyChanged
{
private DateTime _dateVM;
public DateTime DateVM
{
get { return _dateVM; }
set
{
_dateVM = value;
OnPropertyChanged("DateVM");
}
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

我需要实现的是将 DatePicker 中选择的 date 传播到 MyControl's view model。或者,有没有更好的模式可以使用?

最佳答案

您所描述的是一个常见的误解,即所有 View 都应该有一个 View 模型。但是,对于用作控件的 UserControl 来说,简单地使用它们自己的 DependencyProperty 通常要简单得多(也更合适)。

您的方法的问题在于您已在内部分配了 UserControl DataContext,因此无法从控件外部设置它。解决方案是在内部设置DataContext,而是使用RelativeSource Binding 来访问UserControl DependencyProperty就像这样:

<TextBlock Text="{Binding DateCtrl, RelativeSource={RelativeSource 
AncestorType={x:Type YourLocalPrefix:MyControl}}}" />

如果您真的必须使用内部 View 模型,则声明该类型的 DependencyProperty 并按照我上面显示的相同方式将数据绑定(bind)到它:

<TextBlock Text="{Binding YourViewModelProperty.DateVM, RelativeSource={RelativeSource 
AncestorType={x:Type YourLocalPrefix:MyControl}}}" />

关于c# - 如何绑定(bind)自定义依赖属性来控制 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662154/

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