3

我已将 a 绑定ListBox到我的 ViewModel,包括ListBox.SelectedItem. 我想根据是否选择了一个视觉状态来更改视觉状态,但以下内容最初不会更新状态,因此它保持错误状态:

<DataStateBehavior Binding="{Binding SelectedCamera}" Value="{x:Null}" TrueState="CameraSettingsUnselected" FalseState="CameraSettingsSelected"/>

为什么会这样以及如何解决?

4

2 回答 2

3

这里的问题似乎是绑定最初评估为null,因此不会触发评估和状态更改所需的更改通知。

我用以下子类修复了它:

public class FixedDataStateBehavior: DataStateBehavior
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += (sender, routedEventArgs) =>
            {
                var bindingExpression = BindingOperations.GetBindingExpression(this, BindingProperty);
                SetCurrentValue(BindingProperty,new object());
                bindingExpression.UpdateTarget();
            };
    }
}

并像这样使用它:

<FixedDataStateBehavior Binding="{Binding SelectedCamera}" Value="{x:Null}" TrueState="CameraSettingsUnselected" FalseState="CameraSettingsSelected"/>
于 2013-07-22T11:20:06.980 回答
0

上面的答案有效,但我最终创建了一个更通用的 Behavior 类,它可以简单地处理所有绑定,而无需单独指定它们。

public class RefreshDataContextBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        this.AssociatedObject.Loaded += AssociatedObject_Loaded;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        this.AssociatedObject.Loaded -= AssociatedObject_Loaded;
    }

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        var dc = this.AssociatedObject.DataContext;
        this.AssociatedObject.DataContext = null;
        this.AssociatedObject.DataContext = dc;
    }
}

然后只需将其插入到具有 DataContext 的对象上的 XAML 中:

<i:Interaction.Behaviors>
    <local:RefreshDataContextBehavior />
</i:Interaction.Behaviors>
于 2016-12-02T20:03:34.010 回答