2

在使用 MVVM 模式构建 WPF 应用程序时,我对放置依赖属性的位置感到困惑。它进入模型还是视图模型?

编辑

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

我有一堂课叫车站。测量员和土木工程师使用它来表示道路的长度。在大多数情况下,Station 只是一个替身,但它有一些装饰。首先,格式不同。当距离大于 100 英尺时,我们添加一个 + 符号作为另一种格式化方式。因此,在道路下方 1234.56 英尺处,我们可能会有 12+34.56 站。(我将跳过其他装饰,因为这对我的观点来说已经足够好了。)

因此,特殊格式的逻辑存在于模型中的一个类 Station 中。我希望视图中的 TextBox 接受用户输入 1234.56 并将其强制为“12+34.56”的文本值。所以我想要一个 TextBox 让用户访问模型中的一个值,所以它需要是一个依赖属性。(这是正确的,不是吗?)但是用于强制/解析/理解如何在 TextBox 和 Station 之间来回切换的业务逻辑应该存在于 Station 类中。(正确的?)

此外,我稍后希望让用户能够通过单击道路图形来设置站点值,包括在鼠标移动时动态更新值以及在发布数据点时锁定值。(现在你明白我为什么试图保持简短。)

那么这不是我想要创建一个依赖属性的东西,尤其是动态数据点可能稍后会涉及吗?如果没有,我如何使用 MVVM 将文本框项连接到工作站?(在问我的问题之前,我真的对此进行了很多研究,但没有成功。)

  • 保罗
4

2 回答 2

3

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

依赖属性实际上仅适用于与视图相关的功能。您将 View 的 DP 绑定到 ViewModel,而 ViewModel 将实现INotifyPropertyChanged.

将 DP 放入 ViewModel 或模型本身实际上会违反 MVVM 的主要目标之一,因为这会将用户界面技术 (WPF) 耦合到您的模型或特定于应用程序的类型。

于 2012-09-03T23:05:47.793 回答
2

使用 MVVM,您更喜欢INotifyPropertyChanged属性而不是 DependencyProperties。

你的Station类应该用INotifyPropertyChanged. 您的TextBox绑定应使用转换器以您希望的格式呈现和读取值。

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:

<UserControl.Resources>
    <StationConverter Key="StationConverter" />
    <TheViewModel Key="TheVM" />
<UserControl.Resources>

<TextBox Text="{Binding Path=Station.Value, Source={StaticResource TheVM}, Converter={StaticResource StationConverter}, Mode=TwoWay}"/>
于 2012-09-04T00:06:33.550 回答