1

待機カーソルを有効にするには、ボタンのツールバー (ユーザー コントロールです) を話す方法。ViewModelBase から継承された ViewModel があります。しかし、ツールバーで 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}" />

IsWorking次に、UserControl で ViewModelに直接バインドできます。

<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>

これが行うことは、ビジュアル ツリーで Window を見つけて、その DataContext を使用しようとすることです。推奨されないのはなぜですか?Window でこれを使用していない可能性があるため、または含まれている Window が使用している特定の DataContext にバインドしたくない可能性があるためです。いずれにせよ、それは別の可能性です。

于 2012-12-04T14:34:37.170 に答える