【问题标题】:Access Datacontext And A Property In Code Behind At The Same Time同时访问Datacontext和代码中的一个属性
【发布时间】:2011-07-19 21:40:38
【问题描述】:

我正在使用 MVVM/WPF 并尝试做一些看似简单的事情,但找不到干净的解决方案。

我想做以下事情:

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

目前我在工具提示上使用多重绑定(获取文本框数据上下文 + 绑定路径),但这有点 hack。

<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 事件。

如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

  • "使用方法在 UI 上执行与属性绑定相关的其他操作。"如果这是具体的,就可以就如何实现这一点提供建议。

标签: wpf mvvm multibinding valueconverter


【解决方案1】:

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

就在模型属性更新时让方法执行几项操作而言,您可以让视图模型订阅模型类上的事件。只需声明对象 WithEvents (VB.NET) 并为 On[PropertyName]Changed 添加事件处理程序。

在实现 MVVM 时,我倾向于将代码隐藏视为二等公民。如果可以的话,我会尽我所能将所有逻辑推到 ViewModel 或 View 上。我几乎完全停止使用转换器,因为大部分逻辑可以在 ViewModels 中复制,如果它是我想重用的东西,我通常只有一个小助手类来获取传递给它的任何东西,做一些事情,并且把它传回去。我从未真正与 IValueConverter 建立过如此良好的关系......

除此之外,尚不清楚您到底要做什么。我们可以再澄清一下吗?

【讨论】:

    【解决方案2】:

    看起来您正试图让工具提示包含文本框的内容,如果是这样,为什么不这样做呢?

    <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}"/>
    

    【讨论】:

    • 感谢 Jose(和 @CodeWarrior),这些都是令人满意的答案,可以阻止许多小时的损失。我尝试这样做的原因是与 CSLA MVVM 中的验证有关。使用 DataAnnotations 时验证正常,但使用 Csla 验证规则时则不然。我刚刚查看了最新版本,其中验证已更新,现在无需任何额外工作即可运行 (lhotka.net/weblog/CSLA4BusinessRulesSubsystem.aspx)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2010-10-23
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    相关资源
    最近更新 更多