首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ViewModel访问MVVM中的用户控制(工具栏)?

如何从ViewModel访问MVVM中的用户控制(工具栏)?
EN

Stack Overflow用户
提问于 2012-12-04 14:14:50
回答 1查看 3K关注 0票数 1

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

下面是工具栏的代码。我点击了选择按钮。数据是从数据库中选择的。光标必须切换到wait.after选择,光标必须返回正常。

代码语言:javascript
复制
    <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:工具栏中没有继承。这是个基本模型。

代码语言:javascript
复制
private bool _isWorking = false;
public bool IsWorking
{
    get { return _isWorking; }
    set
    {
        _isWorking = value;
        OnPropertyChanged("IsWorking");
    }
}

以下是视图模型中的代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-04 14:34:37

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

当然,usercontrol不能像这样绑定。你有几个选择:

1.给UserControl视图的数据文本:

代码语言:javascript
复制
<local:UserControl1 DataContext="{Binding ElementName=MyWindow}" />

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

代码语言:javascript
复制
<DataTrigger Binding="{Binding IsWorking}" Value="True">
  <Setter Property="Cursor" Value="Wait"/>
</DataTrigger>

2.在UserControl上创建一个依赖项属性,并从视图:绑定到它

在您的用户控件中创建一个新的DP:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
<DataTrigger Binding="{Binding MyIsWorking}" Value="True">
        <Setter Property="Cursor" Value="Wait"/>
</DataTrigger>

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

代码语言:javascript
复制
<local:UserControl1 MyIsWorking="{Binding IsWorking, ElementName=MyWindow}" />

3.最后, will 工作,但不推荐!!**

代码语言:javascript
复制
<DataTrigger Binding="{Binding IsWorking, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="True">
    <Setter Property="Cursor" Value="Wait"/>
</DataTrigger>

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13704898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档