C# 在哪里放置依赖项属性?

C# 在哪里放置依赖项属性?,c#,wpf,mvvm,dependency-properties,C#,Wpf,Mvvm,Dependency Properties,在使用MVVM模式构建WPF应用程序时,我对将依赖项属性放在何处感到困惑。它是放在模型中还是放在视图模型中 编辑 在看了早期的答案之后(谢谢这些),我发现我仍然很困惑,所以我提供了更多的细节来帮助别人向我解释这一点 我有一门课叫车站。测量师和土木工程师使用它来表示道路沿线的长度。在大多数情况下,车站只是一个双人间,但它有一些装饰。首先,格式不同。当距离大于100英尺时,我们添加+符号作为另一种格式化方式。沿着这条路走1234.56英尺,我们可能有12+34.56站。(我将跳过其他装饰,因为这一个

在使用MVVM模式构建WPF应用程序时,我对将依赖项属性放在何处感到困惑。它是放在模型中还是放在视图模型中

编辑 在看了早期的答案之后(谢谢这些),我发现我仍然很困惑,所以我提供了更多的细节来帮助别人向我解释这一点

我有一门课叫车站。测量师和土木工程师使用它来表示道路沿线的长度。在大多数情况下,车站只是一个双人间,但它有一些装饰。首先,格式不同。当距离大于100英尺时,我们添加+符号作为另一种格式化方式。沿着这条路走1234.56英尺,我们可能有12+34.56站。(我将跳过其他装饰,因为这一个足以说明我的观点。)

因此,特殊格式的逻辑存在于Station中,它是模型中的一个类。我希望视图中有一个文本框接受用户输入1234.56,并将其强制为文本值“12+34.56”。所以我想要一个文本框,让用户能够访问模型中的值,所以它需要是一个依赖属性。(这是正确的,不是吗?)。(对吗?)

此外,我将在稍后向用户提供通过单击道路图形图形来设置桩号值的功能,包括在鼠标移动时动态更新值,以及在发出数据点时锁定值。(现在你明白我为什么要保持简短了。)

所以这不是我想要做一个依赖属性的东西吗,特别是在以后可能涉及到动态数据点的情况下?如果没有,我如何使用MVVM将文本框项目挂接到站点?(在提出问题之前,我确实对此进行了大量研究,但没有成功。)

  • 保罗

通常,您不会在ViewModel或模型中使用依赖项属性

依赖项属性实际上仅用于与视图相关的功能。您需要将视图的DP绑定到ViewModel,而ViewModel将实现
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}"/>