【问题标题】:Pass view to viewmodel with datatemplate使用数据模板将视图传递给视图模型
【发布时间】:2011-02-20 12:22:24
【问题描述】:

我有一个名为ParameterEditorView 的窗口,其中ParameterEditorViewModelDataContext。在ParameterEditorViewModel 我有一个ParameterViewModel 的列表。在ParameterEditorView 中,我有一个ItemsControl,其ItemsSource 绑定到ParameterEditorViewModel 中的ParameterViewModel 列表。我需要 ParameterViewModel 来引用 ParameterView(稍后会详细介绍)。在ParameterEditorViewResources 部分,我添加了DataTemplate

<DataTemplate DataType="{x:Type my:ParameterViewModel}" >
    <my:ParameterView HorizontalAlignment="Left"/> 
</DataTemplate>

那么,如何将创建以显示ParameterViewModelParameterView 的引用传递给它?

我在ParameterViewModel 中需要ParameterView 的原因如下: 我有一个TextBox,其Text 属性绑定到PropertyModelView.Name 属性。但是我想在Name 为空或 Null 时显示默认字符串。当发生这种情况时,我尝试将属性值设置为我想要的默认字符串,但在这种情况下未设置 TextBox.Text。我做这样的事情:

private string _name;
public string Name
{
    get { return _name; }
    set
    {
        if (value == null || value.Length == 0)
            Name = _defaultName;
        else
            _name = value;
    }
}

我还尝试将TextBox.Text 绑定模式专门设置为TwoWay,但没有成功。 我认为这是一种防止无限循环发生的防御机制,但我不确定。 在这方面的任何帮助也将受到高度赞赏。

谢谢, 何塞·塔瓦雷斯

【问题讨论】:

    标签: wpf mvvm binding datatemplate


    【解决方案1】:

    {Binding } has a FallbackValue, btw.

    你的问题,让我很困惑。我假设您的 PVM 有一组 PV 作为公共属性,它绑定在 UI 中。另外,我认为您在混淆术语。它的 Model-View-ViewModel 其中 ViewModel 是 View 的 DataContext,而 Model 由 ViewModel 通过公共属性公开。听起来如果您将窗口绑定到 ViewModel 的集合,它们实际上是模型。这可能看起来很迂腐,但正确地使用您的术语将有助于您研究和提出问题。

    另一种解决方案是结合 FallbackValue 将转换器添加到您的绑定中(我必须这样做,IIRC)。如果字符串为空或为空,该转换器将是返回“DependencyProperty.UnsetValue”的 IValueConverter。我认为这有时会起作用,因为如果 TB 为空,TextBox 会将绑定属性设置为空字符串而不是 null。这里有一个小样本可以刺激你的口哨(不保证有效;你需要调试和调整它):

    public class ThisMightWorkConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, 
            object parameter, System.Globalization.CultureInfo culture)
        {
            var temp = value as string;
            if(string.IsNullOrWhiteSpace(temp))
                return System.Windows.DependencyProperty.UnsetValue;
            return temp;
        }
    
        public object ConvertBack(object value, Type targetType, 
            object parameter, System.Globalization.CultureInfo culture)
        {
            return value; // you might need to change this
        }
    }
    

    【讨论】:

    • 好吧,我可能没有表达清楚。我有一个名为 ParameterEditorView 的窗口和一个 ParameterEditorViewModel。在 ParameterEditorView 我有一个 ParameterViewModel 列表。在 ParameterEditorView 中,我有一个 ItemsControl,其 ItemsSource 绑定到 ParameterEditorViewModel 中的 ParameterViewModel 列表。我还在 ParameterEditorView 中定义了上面显示的DataTemplate。绑定工作正常,但我想知道是否可以将自动创建以显示 ParameterViewModel 的 ParameterView 的引用传递给 ParameterViewModel。
    • @jps 假设 ParameterView 是一个用户控件。如果您尝试将一大块 UI 传递给 ViewModel 或 Model,那么您就做错了。我认为陈述你的问题并寻求解决方案对你有利,而不是沿着你正在走的路走。 FallbackValue 是一种选择。我编辑添加了第二个选项。
    • 我想第二个选项是克服这个问题的好选择。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多