【问题标题】:How to access usercontrol (toolbar) from ViewModel in MVVM?如何从 MVVM 中的 ViewModel 访问用户控件(工具栏)?
【发布时间】:2012-12-04 14:14:50
【问题描述】:

如何在按钮上使用工具栏(它是一个用户控件)来启用等待光标。 我有一个 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 与工具栏通信?单击选择光标必须打开等待模式。选择后,光标必须是手形(默认)。

Changing the cursor in WPF sometimes works, sometimes doesn't

【问题讨论】:

    标签: c# .net wpf mvvm


    【解决方案1】:

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

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

    1 . 为 UserControl 提供 View 的数据上下文:

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

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

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

    2 。 在您的 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));
    

    在用户控件的 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。不管怎样,这是另一种可能。

    【讨论】:

    • 一切正常。谢谢。但是如何处理异常。如果发生异常,光标必须是默认的。
    • @programmerist 我认为这是一个新问题,因为它与原始问题(“从 VM 访问工具栏”)无关。但简而言之,你可能应该在 VM 中有另一个名为 IsErrorOccured 的布尔属性,并在为 true 时使用另一个 DataTrigger 来更改光标。
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 2010-12-11
    • 1970-01-01
    • 2015-07-21
    • 2011-11-04
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多