2012-12-04 85 views
1

如何在按鈕上使用工具欄(這是一個用戶控件)啓用等待光標。 我有一個ViewModel繼承自viewmodelBase。但我不能在工具欄上使用IsWorking。如何從MVVM中的ViewModel訪問用戶控件(工具欄)?

下面的代碼是工具欄的代碼。我點擊選擇按鈕。數據正在從數據庫中選擇。遊標必須等待。選擇後,遊標必須恢復正常。



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

如何從視圖模型工具欄溝通?點擊選擇光標必須轉爲等待模式。選擇後,光標必須是手形(默認)。

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

enter image description here

回答

4

從我所看到的,你的問題是,你想從你的用戶控件綁定回視圖/窗口,它的位置。

usercontrol當然不會像這樣綁定。 您有幾個選擇:

1。 給用戶控件視圖的DataContext的:

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

,然後在你的用戶控件可以綁定到視圖模型的IsWorking直接:

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

2。 你的用戶控件創建一個依賴屬性,並從視圖綁定到它:
在你的用戶控件創建一個新的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到虛擬機的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樹窗口,並使用它的DataContext。爲什麼不推薦?因爲你可能不會在Window中使用它,或者你可能不希望它綁定到包含Window的特定DataContext。無論哪種方式,這是另一種可能性。

+0

一切都很好。謝謝。但如何處理異常。如果發生異常,光標必須是缺省值。 – programmerist

+0

@programmerist我認爲這是一個新問題,因爲它與原始問題無關(「從VM訪問工具欄」)。但是,簡而言之,您應該在虛擬機中有另一個名爲IsErrorOccured的布爾屬性,並在其爲true時使用另一個DataTrigger來更改光標。 – Blachshma

相關問題