2011-01-26 36 views
8

Tôi đang viết tệp XAML sử dụng DataTrigger để đặt thuộc tính trong ViewModel. Lớp ViewModel được định nghĩa là:Cách sử dụng DataTrigger để đặt thuộc tính được xác định trong ViewModel trong WPF

public class ShellModel : INotifyPropertyChanged 
{  
    public Brush ForegroundBrush 
    { 
     get; set; 
    } 

    .................... 
} 

Tôi muốn sử dụng DataTrigger trong View.xaml để đặt thuộc tính ForegroundBrush. XAML tôi đã viết là:

<StatusBar Name="statusBar" Grid.Row="3"> 
    <StatusBarItem> 
     <StatusBarItem.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding HasError}" Value="True"> 
         <Setter Property="ForegroundBrush" Value="Red" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding HasError}" Value="False"> 
         <Setter Property="ForegroundBrush" Value="Black" /> 
        </DataTrigger> 
         </Style.Triggers> 
      </Style> 
     </StatusBarItem.Style> 
     <TextBlock Name="statusBarMessage" Foreground="{Binding ForegroundBrush}" Text="{Binding StatusMessage}"></TextBlock> 
    </StatusBarItem> 
    ........................ 

Điều này không biên dịch. Khi tôi thay đổi

 <Setter Property="ForegroundBrush" Value="Black" />  

để

 <Setter Property="ShellModel.ForegroundBrush" Value="Black" /> 

nó mang lại cho tôi lỗi:

Dependency property field missing ....

Làm thế nào tôi sẽ viết thư này để các DataTrigger có thể thiết lập ForegroundBrush tài sản trong ViewModel?

Trả lời

6

Các bộ định tuyến trong Trình dữ liệu của bạn chỉ nên thay đổi các thuộc tính của các phần tử giao diện người dùng của bạn (và chúng cũng chỉ hoạt động với DependencyProperties).
Đặt Foregound Thuộc tính của StatusBarItem của bạn trực tiếp và đặt TargetType của Kiểu. Điều đó sẽ giúp ích.

<Style TargetType="{x:Type StatusBarItem}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding HasError}" Value="True"> 
       <Setter Property="Foreground" Value="Red" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding HasError}" Value="False"> 
       <Setter Property="Foreground" Value="Black" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Có thông tin về cách trình bày trực quan trong ViewModel của bạn thường không phải là ý tưởng hay.

Các vấn đề liên quan