2013-07-04 34 views
5

Vì vậy, ví dụ tôi có một số ứng dụng MVVM WPF với mô hình đơn giản:Tại sao tôi không thể sử dụng DynamicResource với DataGridColumn.CellStyle

public class MyObject 
{ 
    public string F1 { get; set; } 
    public string F2 { get; set; } 
} 

và mô hình nhìn đơn giản mà tạo ra 3 dòng:

public class MyViewModel 
{ 
    public ObservableCollection<MyObject> Objects { get; set; } 

    public MyViewModel() 
    { 
     Objects = new ObservableCollection<MyObject> 
      { 
       new MyObject{F1 = "V1",F2 = "B1"}, 
       new MyObject{F1 = "V2",F2 = "B2"}, 
       new MyObject{F1 = "V3",F2 = "V3"} 
      }; 
    } 
} 

Và theo quan điểm, tôi có một số DataGrid với các cột được xác định theo cách thủ công và cho mỗi cột, tôi đặt CellStyle. Cả hai kiểu được xác định trong khối Window.Resources. Nhưng đối với cột đầu tiên, tôi sử dụng StaticResource và cho phần thứ hai DynamicResource

Xem XAML:

<Window x:Class="WpfApplication12.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" x:Name="WholeWindow"> 
<Window.Resources> 
    <Style x:Key="BaseCellClass" TargetType="DataGridCell"> 
     <Setter Property="Foreground" Value="Blue" /> 
    </Style> 
</Window.Resources> 
<Grid> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=WholeWindow, Path=ViewModel.Objects}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding F1}" Header="F1" CellStyle="{StaticResource BaseCellClass}" /> 
      <DataGridTextColumn Binding="{Binding F2}" Header="F2" CellStyle="{DynamicResource BaseCellClass}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Vì vậy, vấn đề là: trong cột thứ hai, các nguồn tài nguyên không được áp dụng cho các cột.

see second column

+0

Điều này có vẻ như hành vi mong đợi đối với tôi? Bạn có thể làm rõ những gì bạn cảm thấy vấn đề? – MoonKnight

+0

Vấn đề là 'CellStyle' là một' DependencyProperty', nhưng khi tôi cố gắng sử dụng ràng buộc trong nó, nó không hoạt động. Rõ ràng họ đã làm cho nó 'DependencyProperty' vì một lý do. – Envilogger

+2

Điều gì sẽ xảy ra nếu bạn di chuyển kiểu BaseCellClass sang tài nguyên Ứng dụng của mình (hoặc một vị trí khác được tải trước khi 'Cửa sổ' được khởi tạo)? –

Trả lời

1

Bạn có thể tạo ra nguồn lực cho các thuộc tính trong bạn DataGridCellStyle và sau đó tham khảo chúng như là một DynamicResource trong Style định nghĩa:

Dựa trên ví dụ của bạn nó sẽ trông như thế này:

<Window.Resources> 
    <SolidColorBrush x:Key="ForegroundBrush" Color="Blue"/> 

    <Style x:Key="BaseCellClass" TargetType="DataGridCell"> 
     <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}" /> 
    </Style> 
</Window.Resources> 
<Grid> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=WholeWindow, Path=ViewModel.Objects}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding F1}" Header="F1" CellStyle="{StaticResource BaseCellClass}" /> 
      <DataGridTextColumn Binding="{Binding F2}" Header="F2" CellStyle="{StaticResource BaseCellClass}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Tất nhiên tài nguyên sẽ được đặt trong các tệp tài nguyên riêng biệt.

+0

Cảm ơn bạn. Tâm hồn của bạn hoạt động tốt. Nhưng trong câu hỏi tôi quên nói rằng tôi cần một cách để lấy được phong cách như trong câu hỏi này: http: // stackoverflow.com/questions/9490264/dynamicresource-for-style-basedon – Envilogger

+0

Dù sao tôi sẽ đánh dấu câu trả lời của bạn là đúng và đăng giải pháp của riêng tôi, nơi tôi sử dụng ít dịch vụ cho điều đó – Envilogger

0

Tôi đã tìm thấy giải pháp bằng cách sử dụng một dịch vụ nhỏ. Trong vài từ tôi viết bằng xaml mã này:

<wpfApplication12:DataGridColumnDynamicStyleService TargetGrid="{Binding ElementName=Grid}"> 
     <wpfApplication12:DataGridColumnDynamicStyleService.ColumnStyles> 
      <wpfApplication12:DataGridColumnStyleBinding ColumnTag="C1" DynamicStyle="{DynamicResource BaseCellClass}" /> 
     </wpfApplication12:DataGridColumnDynamicStyleService.ColumnStyles> 
    </wpfApplication12:DataGridColumnDynamicStyleService> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=WholeWindow, Path=ViewModel.Objects}" x:Name="Grid"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding F1}" Header="F1" wpfApplication12:DataGridColumnDynamicStyle.ColumnTag="C1" /> 
      <DataGridTextColumn Binding="{Binding F2}" Header="F2" wpfApplication12:DataGridColumnDynamicStyle.ColumnTag="C2" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Ở đây, như bạn có thể thấy, tôi sử dụng thuộc tính đính kèm ColumnTag để xác định cột. Và tôi tạo điều khiển dịch vụ xác định kiểu cho cột và đặt datagrid mục tiêu là TargetGrid Nếu bạn muốn xem tất cả mã, dưới đây là liên kết đến giải pháp trên google drive

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