2012-04-11 40 views
11

Tôi cố gắng để vượt qua các ListView hoặc GridView như một ConverterParameter Tuy nhiên, trong các thói quen Chuyển đổi các tham số đến như một loại chuỗiLàm thế nào để vượt qua GridView như một ConverterParameter

Dưới đây là một phần của danh sách XAML xem và lớp Converter.

Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn!!!

<ListView Name="SeqDtStDataListView1" Grid.Row="1" 
     DataContext="{Binding Path=DisplayDT[0], Converter ={StaticResource  
                 CNVToColumn},ConverterParameter=?????}" 
     VerticalContentAlignment="Stretch" VerticalAlignment="Stretch" 
                 HorizontalAlignment="Stretch" 
     SelectionChanged="SEQDatalistview_SelectionChanged" Margin="5"> 


     <ListView.View > 
      <GridView x:Name="SeqDtStDataGridView1"/> 
     </ListView.View> 
    </ListView> 

Chuyển đổi:

namespace MFTest.Converters 
{ 
public class CNVToColumn : IValueConverter 
{ 

    public object Convert(object value, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     DataTable dt = (DataTable)value; 
     GridView GV = (GridView)parameter;    <========= fail here =========== 
     if (dt != null && GV != null) 
      foreach (var colum in dt.Columns)    // Binding the Columns 
      { 
       DataColumn dc = (DataColumn)colum; 
       GridViewColumn column = new GridViewColumn(); 
       column.DisplayMemberBinding = new Binding(dc.ColumnName); 
       column.Header = dc.ColumnName; 
       GV.Columns.Add(column); 
      } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

} 
} 

Trả lời

-3

Bạn có thể sử dụng ConverterParameter={Binding ElementName=[insert x:Name of grid view]}

Mặc dù IMHO tôi muốn xem xét lại nhu cầu - bạn có thực sự cần phải vượt qua một UIControl như một tham số Converter?

+0

Khi chạy trên một phần lớp lỗi này bật lên: Không thể đặt 'Binding' trên thuộc tính 'ConverterParameter' loại 'Binding'. Chỉ có thể đặt 'Binding' trên DependencyProperty của DependencyObject. –

+0

@IrmiMrm - Câu trả lời ngắn .. bạn không thể làm điều đó .. dễ dàng. Bạn chỉ có thể liên kết với các thuộc tính DP trên các dẫn xuất của DependencyObject. Ràng buộc không đủ điều kiện - bạn đang cố gắng chỉ định một Ràng buộc cho thuộc tính ElementName của một Ràng buộc khác. Có vẻ quá phức tạp .. một giải pháp đơn giản cho vấn đề phải tồn tại. – Gishu

6

Bạn không thể liên kết với nó.

ConvertParameter kế thừa từ Đối tượng và do đó không bị ràng buộc.

Tuy nhiên, bạn có thể xác định Ràng buộc của mình trong mã phía sau thay vì thực hiện trong phần XAML.

System.Windows.Data.Binding b = new System.Windows.Data.Binding(); 
b.ConverterParameter = this; 

Vui lòng đọc về những hạn chế trên ConvertParameter here

+0

Âm thanh hay, tôi sẽ cố gắng, Cảm ơn! –

+0

@Luis Filipe - không chắc chắn về bài đăng được liên kết. IMM ViewModels không được chứa bất kỳ thuộc tính phụ thuộc nào .. Tôi kết hợp DP nhiều hơn với Chế độ xem/Điều khiển thay vì với Chế độ xem không xác định lượt xem. – Gishu

+0

'ConverterParameter' không kế thừa từ bất kỳ thứ gì, đó là thuộc tính, vấn đề là' MarkupExtension' không kế thừa từ 'DependencyObject'. –

17

Từ NET 4 trở đi bạn có thể sử dụng x:Reference cho phép bạn để tránh một ràng buộc ElementName mà chỉ có thể được đặt trên các thuộc tính phụ thuộc trong khi đạt được khá nhiều điều tương tự.

Do hạn chế phụ thuộc chu kỳ, bạn không thể tham chiếu điều khiển bên trong chính nó hoặc tổ tiên của nó trong cây. Tuy nhiên, bạn có thể di chuyển liên kết lên một cấp và chỉ kế thừa số DataContext, ví dụ:

<Border DataContext="{Binding Path=DisplayDT[0], 
           Converter={StaticResource CNVToColumn}, 
           ConverterParameter={x:Reference SeqDtStDataListView1}}"> 
    <ListView Name="SeqDtStDataListView1" Grid.Row="1"> 
+0

* bạn không thể tham chiếu một điều khiển bên trong chính nó hoặc các phần tử của nó *. Bạn có nghĩa là ** tổ tiên **. Bạn không thể tham chiếu tổ tiên. – AgentFire

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