将视图传递给包含数据模板的视图模型

将视图传递给包含数据模板的视图模型

问题描述:

我有一个名为ParameterEditorView的窗口,其中ParameterEditorViewModelDataContext。在ParameterEditorViewModel我有一个列表ParameterViewModel。在ParameterEditorView我有一个ItemsControlItemsSource绑定到 ParameterViewModel名单。我需要ParameterViewModel来引用ParameterView(稍后会详细介绍)。在ParameterEditorViewResources部分我添加了DataTemplate将视图传递给包含数据模板的视图模型

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

所以,我怎么能传递一个创建以显示ParameterViewModel它的ParameterView的参考?

我之所以需要在ParameterViewModelParameterView如下: 我有一个TextBoxText属性绑定到PropertyModelView.Name财产。但是我想在Name为空或空时显示默认字符串。我试图将属性值设置为我想要的默认字符串,但在此场景中未设置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结合模式没有成功双向。 我认为这是防止发生无限循环的防御机制,但我不确定。 任何在这方面的帮助也将不胜感激。

感谢, 何塞·塔瓦雷斯

{Binding } has a FallbackValue, btw.

你的问题,它混淆了我。我假设你的PVM将PV的集合作为一个公共属性,并绑定在UI中。另外,我认为你在混合术语。它的Model-View-ViewModel,其中ViewModel是View的DataContext,Model由ViewModel通过公共属性公开。听起来好像你将窗口绑定到ViewModel的集合,他们实际上是Models。这看起来很迂腐,但是让你的条款正确有助于你研究和提出问题。

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

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 
    } 
} 
+0

嗯,我可能已经不能清楚地表达自己。 我有一个名为ParameterEditorView的窗口和一个ParameterEditorViewModel。在ParameterEditorView中,我有一个ParameterViewModel的列表。在ParameterEditorView中,我有一个ItemsControl,它的ItemsSource绑定到ParameterEditorViewModel的ParameterViewModel列表中。我还在ParameterEditorView中定义了上面显示的'DataTemplate'。 绑定工作正常,但我想知道是否可以将ParameterView的引用(即自动创建的)显示ParameterViewModel以传递给ParameterViewModel。 – jpsstavares 2010-05-17 17:21:15

+0

@jps假设ParameterView是一个UserControl。如果你试图将一大块用户界面传递给ViewModel或Model,那么你会做错某些事情。我认为说出你的问题并寻求解决方案,而不是走上正确的道路对你有利。 FallbackValue是一个选项。我编辑添加第二个选项。 – Will 2010-05-17 17:31:47

+0

我想这第二个选项是克服这个问题的好选择。谢谢您的帮助。 – jpsstavares 2010-05-19 09:02:03