我正在使用MVVM / WPF并尝试做一些看似简单的事情,但无法找到一个干净的解决方案。
我想做以下事情:
当模型中的属性发生更改时(在这种情况下将更改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 :(得分:1)
好的,就你的Multibinding而言,你想在那里完成什么?我不知道你的转换器应该做什么,但是不能用IValueConverter实现类吗?我假设没有,看起来你正在将文本框传递给转换器。
当模型属性更新时,让方法执行多项操作,您可以让viewmodel订阅模型类上的事件。只需声明对象WithEvents(VB.NET)并为On [PropertyName] Changed添加事件处理程序。
在实现MVVM时,我倾向于将代码隐藏视为二等公民。如果可以的话,我会尽力将所有逻辑推送到ViewModel或View。我几乎完全停止使用转换器,因为很多逻辑可以在ViewModels中复制,如果它是我想要重复使用的东西,我通常只有一个小帮助类,可以获取传递给它的任何东西,做一些事情,以及将它传回去。我从来没有真正与IValueConverter建立良好关系...
除此之外,目前还不清楚你到底要做什么。我们能得到更多的澄清吗?
答案 1 :(得分: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}"/>