2011-07-19 29 views
0

我正在使用MVVM/WPF并试图做一些看似简单的事情,但无法找到干净的解决方案。在同一时间访问DataContext和代码中的属性

我要做到以下几点:

当模型中的一个属性更改(WPF文本框的文本会在这种情况下进行更改),使用方法上与绑定的属性的UI执行其他操作。

当前我在工具提示上使用多重绑定(获取文本框datacontext +绑定路径),但这有点破解。

<TextBox x:Name="textBox" Text="{Binding Model.MyProperty}"> 
<TextBox.ToolTip> 
     <MultiBinding Converter="{StaticResource brNewMultiConverter}"> 
       <!-- This to trigger the converter in all required cases. 
        Without it, i cant get the event to fire when filling 
        the model initially 
       --> 
       <Binding ElementName="textBox" Path="Text" /> 
       <!-- This has the properties i need, but wont fire without 
        the binding above --> 
       <Binding ElementName="textBox" /> 
     </MultiBinding> 
</TextBox.ToolTip> 
</TextBox> 

我想提出一些可重复使用的,并可能是针对不同的控制,所以我不是只用TextChanged事件。

如果任何人都可以指出我正确的方向,它将不胜感激。

+0

“使用方法上与绑定的属性的UI执行其他操作。”如果这是特定的,就有可能为实现这一目的的方式提供建议。 – Will

回答

0

它看起来像你试图让工具提示有文本框的内容,如果是的话,为什么不这样做呢?

<TextBox Text="{Binding Model.MyProperty}" ToolTip="{Binding Model.MyProperty}"/> 

如果这不是你想要的,但要根据文本框的值的提示修改,然后做你的视图模型如

public class MyViewModel 
{ 
    string _MyProperty; 
    public string MyProperty 
    { 
    get { return _MyProperty;} 
    set 
    { 
     _MyProperty = value; 
     OnPropertyChanged("MyProperty"); 
     OnPropertyChanged("MyToolTipProperty"); //force WPF to get the value of MyToolTipProperty 
    } 
    } 

    public string MyToolTipProperty 
    { 
    get 
    { 
     //return what you want 
    } 

    } 
} 

,然后在您的标记:

<TextBox Text="{Binding Model.MyProperty}" ToolTip="{Binding Model.MyToolTipProperty}"/> 
+0

非常感谢Jose(和@CodeWarrior),这两个都是令人满意的答案,可以阻止很多小时的流失。我试图这样做的原因是在CSLA MVVM中使用验证。使用DataAnnotations时验证通过的很好,但在使用Csla验证规则时没有验证。我刚刚查看了最新版本,验证已更新,现在无需任何额外工作即可运行(http://www.lhotka.net/weblog/CSLA4BusinessRulesSubsystem.aspx)。 – HockeyJ

1

好的,就你的多重绑定而言,你想在那里完成什么?我不知道你的转换器应该做什么,但是不能用IValueConverter实现类来完成吗?我假设不,看起来你正在将文本框传递给转换器。

只要有一个方法在模型属性更新时做了几件事情,您可以让viewmodel订阅模型类上的事件。只需声明对象WithEvents(VB.NET)并为On [PropertyName] Changed添加事件处理程序。

实现MVVM时,我倾向于将代码隐藏视为二级公民。如果可以,我尽我所能将所有逻辑推送到ViewModel或View。我几乎完全停止了使用转换器,因为许多逻辑可以在ViewModels中复制,如果它是我想要重用的东西,我通常只需要一个帮助器类来获取传递给它的任何东西,把它传回去。我从来没有真正与IValueConverter有过这么好的关系......

除此之外,目前还不清楚你想要做什么。我们能否得到更多的澄清?

相关问题