C# 在哪里放置依赖项属性?
在使用MVVM模式构建WPF应用程序时,我对将依赖项属性放在何处感到困惑。它是放在模型中还是放在视图模型中 编辑 在看了早期的答案之后(谢谢这些),我发现我仍然很困惑,所以我提供了更多的细节来帮助别人向我解释这一点 我有一门课叫车站。测量师和土木工程师使用它来表示道路沿线的长度。在大多数情况下,车站只是一个双人间,但它有一些装饰。首先,格式不同。当距离大于100英尺时,我们添加+符号作为另一种格式化方式。沿着这条路走1234.56英尺,我们可能有12+34.56站。(我将跳过其他装饰,因为这一个足以说明我的观点。) 因此,特殊格式的逻辑存在于Station中,它是模型中的一个类。我希望视图中有一个文本框接受用户输入1234.56,并将其强制为文本值“12+34.56”。所以我想要一个文本框,让用户能够访问模型中的值,所以它需要是一个依赖属性。(这是正确的,不是吗?)。(对吗?) 此外,我将在稍后向用户提供通过单击道路图形图形来设置桩号值的功能,包括在鼠标移动时动态更新值,以及在发出数据点时锁定值。(现在你明白我为什么要保持简短了。) 所以这不是我想要做一个依赖属性的东西吗,特别是在以后可能涉及到动态数据点的情况下?如果没有,我如何使用MVVM将文本框项目挂接到站点?(在提出问题之前,我确实对此进行了大量研究,但没有成功。)C# 在哪里放置依赖项属性?,c#,wpf,mvvm,dependency-properties,C#,Wpf,Mvvm,Dependency Properties,在使用MVVM模式构建WPF应用程序时,我对将依赖项属性放在何处感到困惑。它是放在模型中还是放在视图模型中 编辑 在看了早期的答案之后(谢谢这些),我发现我仍然很困惑,所以我提供了更多的细节来帮助别人向我解释这一点 我有一门课叫车站。测量师和土木工程师使用它来表示道路沿线的长度。在大多数情况下,车站只是一个双人间,但它有一些装饰。首先,格式不同。当距离大于100英尺时,我们添加+符号作为另一种格式化方式。沿着这条路走1234.56英尺,我们可能有12+34.56站。(我将跳过其他装饰,因为这一个
- 保罗
INotifyPropertyChanged
将DP放入ViewModel或模型本身实际上违反了MVVM的主要目标之一,因为这会将用户界面技术(WPF)与您的模型或特定于应用程序的类型相结合。对于MVVM,您更喜欢
INotifyPropertyChanged
属性而不是DependencyProperties
您的站点
类应使用INotifyPropertyChanged
实现属性。您的文本框
绑定应使用转换器以您希望的格式显示和读取值
public class Station : INotifyPropertyChanged
{
private decimal _value;
public decimal Value
{
get { return _value; }
set
{
if (_value == value) return;
_value = value;
NotifyPropertyChanged("Value");
}
}
/* INotifyPropertyChanged implementation */
}
public class StationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string formattedValue = // Add the plus here
return formattedValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string numericValue = // Parse the optional '+' out of the value
decimal stationValue = decimal.Parse(numericValue);
}
}
XAML:
Related:Rachel的回答对你的问题有好处,我相信。Avada Kedavra:我看了这个问题,但似乎没有得到与我相同的问题,所以我编辑了我的作品,以便更清晰。Reed Copsey:我明白你的意思(请查看我编辑的作品)。但当我读到类似Petzold的3D Programming For Windows,pp 257--270,据我所知,他的自定义依赖属性似乎在他的模型中(而且他没有实现VM)--据我所知。@philologon“所以我想要一个文本框,让用户访问模型中的值,所以它需要是一个依赖属性”-不正确。您可以从文本框绑定到实现INotifyPropertyChanged
的类中的属性。另外,Petzold的书是关于使用WPF的,但不是关于通过MVVM使用WPF的。在他的书中,他并没有真正做任何与MVVM相关的事情,但更多的只是让事情“快速而肮脏”。对于MVVM,我会在别处寻找(即:)我同意里德的观点。DP用于用户控件和应用XAML中的绑定。Reed,我按照链接访问了您的网页和系列。我打算很快读它。我真的很感谢你的帮助。非常感谢。谢谢你的解释。你在这里解释的比四本书所能解释的还要多。
<UserControl.Resources>
<StationConverter Key="StationConverter" />
<TheViewModel Key="TheVM" />
<UserControl.Resources>
<TextBox Text="{Binding Path=Station.Value, Source={StaticResource TheVM}, Converter={StaticResource StationConverter}, Mode=TwoWay}"/>