如何从MVVM中的ViewModel访问usercontrol(工具栏)?

时间:2012-12-04 14:14:50

标签: c# .net wpf mvvm

如何在按钮上使用工具栏(它是用户控件)来启用等待光标。 我有一个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

enter image description here

1 个答案:

答案 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。无论哪种方式,这是另一种可能性。