【问题标题】:ConvertBack not fired未触发 ConvertBack
【发布时间】:2012-02-12 16:05:11
【问题描述】:

我正在像这样使用我的转换器:

<ControlTemplate TargetType="{x:Type TabItem}">
<Border Name="Border" 
    Background="{Binding
        Path=ConversationState,
        Converter={StaticResource conversationStatusConverter},
        Mode=TwoWay,
        NotifyOnSourceUpdated=true,
        ValidatesOnExceptions=True,
        UpdateSourceTrigger=PropertyChanged}" >

这是我的触发器定义:

<ControlTemplate.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Setter TargetName="Border" Property="Background" Value="DeepPink" />
    </Trigger>
    <Trigger Property="IsSelected" Value="False">
        <Setter TargetName="Border" Property="Background" Value="LightGray" />
    </Trigger>
</ControlTemplate.Triggers>

还有我的转回方法:

public object ConvertBack(object value, Type targetType, object parameter,
    CultureInfo culture)
{
    if (value.ToString() == "DeepPink")
        return ConversationStatus.Active;
    else if (value.ToString() == "Orange")
        return ConversationStatus.UnseenMessage;
    else if (value.ToString() == "LightGray")
        return ConversationStatus.Inactive;
    else return DependencyProperty.UnsetValue;
}

当一个选项卡被选中时,背景变成深粉色,但模型永远不会被修改,状态和以前一样。源到目标工作(转换确定),通过选项卡项的 isselected 属性在触发器中目标到源,不在模型上做任何事情。 非常感谢!

【问题讨论】:

  • 如果状态和以前一样,你怎么能说转换(转发)有效。级联到转换器的触发器 - 我不认为它打算以这种方式使用。我不明白为什么你不能处理 TabItem 的 IsSelected。

标签: wpf xaml data-binding triggers ivalueconverter


【解决方案1】:

您只需覆盖绑定,双向绑定仅在属性的 current 值被更改时才有效,例如当用户在TextBox 中键入文本时,SetCurrentValue 内部会调用 Text 属性,保留任何绑定。

Backgrounds 永远不会以这种方式更改,您无法在不替换绑定的情况下更改 XAML 中的值。

您应该尝试以不同的方式处理此问题,至少可以说从颜色中获取状态信息似乎是有问题的。 (你甚至不会从画笔中得到这些字符串,它们应该转换成类似#FFFF00FF 的东西)

编辑: 如 cmets 中所述,您可以处理 TabControl.SelectionChanged 并设置新选定项目的状态。如果您确实必须避免在视图中使用代码隐藏(MVVM 不需要此代码!),您也可以使用 a workaround

【讨论】:

  • 这与联系人的状态无关,它只是查看用户是否通过激活视图来阅读消息。我无法从任何地方获取它,但选项卡已选中。这只是一个例子,但我真的需要完成这项工作。就像 gtalk 一样,当您收到消息时,选项卡会闪烁,一旦您激活选项卡,它就会停止闪烁。
  • @Anna:您可以处理选项卡控件上的SelectionChanged 事件,获取底层选项卡数据对象并清除其状态。随着属性被绑定,Background 将自动变回。
  • 这是 MVVM...我无法在代码中处理它,也无法在视图模型中使用任何 UI 元素。会调查你覆盖绑定的东西..
  • @Anna:是的,你可以,这是一个神话,你不能。我也从来没有说过虚拟机中的 UI 元素。
  • 我可以有代码隐藏,但没有对 viewmodel 的引用。但无论如何,我无法处理 selectionchanged 因为 tabitem 只是一个模板,而我的 tabcontrol 绑定在可观察的视图模型集合上。所以无法进入tab项,手动更改背景属性等等。
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2013-01-03
  • 2021-07-22
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多