1

如何在按钮上使用工具栏(它是一个用户控件)来启用等待光标。我有一个 ViewModel 是从 viewmodelBase 继承的。但我不能在工具栏上使用 IsWorking。

下面的代码是工具栏的代码。我点击了选择按钮。数据正在从数据库中选择。光标必须转动等待。选择后,光标必须返回正常。



    <Button x:Name="Select"
            Content="select"
            Command="{Binding SelectCommand }">
        <Button.Style>
             <Style TargetType="{x:Type Button}">
                 <Setter Property="Cursor" Value="Arrow"/>
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding Path=IsWorking}" Value="True">
                         <Setter Property="Cursor" Value="Wait"/>
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
        </Button.Style>
    </Button>

ViewModelBase.cs: 工具栏没有继承。它是一个基本模型。

private bool _isWorking = false;
public bool IsWorking
{
    get { return _isWorking; }
    set
    {
        _isWorking = value;
        OnPropertyChanged("IsWorking");
    }
}

这是视图模型中的代码:

public class MainViewModel : ViewModelBase
{
    public void Select()
    {
        IsWorking = true;     cursor turn to wait mode
        // db Process...

        IsWorking = false;  cursor turn to hand mode
    }
}

如何从 ViewModel 与工具栏通信?单击选择光标必须打开等待模式。选择后,光标必须是手形(默认)。

在 WPF 中更改光标有时有效,有时无效

在此处输入图像描述

4

1 回答 1

4

据我所知,您的问题是您试图从 UserControl 绑定回它所在的视图/窗口。

用户控件当然不能像这样绑定。你有几个选择:

1. 给 UserControl 视图的数据上下文:

<local:UserControl1 DataContext="{Binding ElementName=MyWindow}" />

然后在您的 UserControl 中,您可以IsWorking直接绑定到 ViewModel:

<DataTrigger Binding="{Binding IsWorking}" Value="True">
  <Setter Property="Cursor" Value="Wait"/>
</DataTrigger>

2. 在您的用户控件上创建一个依赖属性并从视图绑定到它:
在您的用户控件中创建一个新的 DP:

public bool MyIsWorking
{
  get { return (bool)GetValue(MyIsWorkingProperty ); }
  set { SetValue(MyIsWorkingProperty , value); }
}

public static readonly DependencyProperty MyIsWorkingProperty =
        DependencyProperty.Register("MyIsWorking", typeof(bool), typeof(UserControl1),    new UIPropertyMetadata(false));

在 usercontrol 的 XAML 中绑定到 DP:

<DataTrigger Binding="{Binding MyIsWorking}" Value="True">
        <Setter Property="Cursor" Value="Wait"/>
</DataTrigger>

在您的窗口中 - 将 DP 绑定到 VM 的IsWorking属性:

<local:UserControl1 MyIsWorking="{Binding IsWorking, ElementName=MyWindow}" />

3. 最后 起作用,但不建议这样做!!!**

<DataTrigger Binding="{Binding IsWorking, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="True">
    <Setter Property="Cursor" Value="Wait"/>
</DataTrigger>

它的作用是尝试在可视树中找到窗口并使用它的 DataContext。为什么不推荐?因为您可能没有在 Window 中使用它,或者您可能不希望它绑定到包含 Window 正在使用的特定 DataContext。不管怎样,这是另一种可能。

于 2012-12-04T14:34:37.170 回答