如何在按钮上使用工具栏(它是用户控件)来启用等待光标。 我有一个ViewModel继承自viewmodelBase。但是我不能在工具栏上使用IsWorking。
下面的代码是工具栏的代码。我点击了选择按钮。数据是从数据库中选择的。光标必须转到wait.after选择,光标必须返回正常。
<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的工具栏进行通信?单击选择光标必须转动等待模式。选择后,光标必须是手动(默认)。
Changing the cursor in WPF sometimes works, sometimes doesn't
答案 0 :(得分:4)
从我看到的,你的问题是你正试图从你的UserControl绑定到它所在的视图/窗口。
用户控件当然不能像这样绑定。 您有几个选择:
1。 为UserControl提供View的datacontext:
<local:UserControl1 DataContext="{Binding ElementName=MyWindow}" />
然后在你的UserControl中你可以直接绑定到ViewModel的IsWorking
:
<DataTrigger Binding="{Binding IsWorking}" Value="True">
<Setter Property="Cursor" Value="Wait"/>
</DataTrigger>
2。
在UserControl上创建一个依赖项属性并从视图中绑定它:
在您的usercontrol中创建一个新的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>
这样做是为了在Visual Tree中找到Window并使用它的DataContext。为什么不推荐?因为您可能没有在Window中使用它,或者您可能不希望它绑定到包含Window正在使用的特定DataContext。无论哪种方式,这是另一种可能性。