2013-03-05 16 views
12

Trong một số ListBox Tôi có thuộc tính IsSelected của ItemContain được liên kết với thuộc tính 01Mcủa ViewModel sử dụng cú pháp <ListBox.ItemContainerStyle>.Chỉ định loại dữ liệu địa lý trên hộp danh sách ItemContainer theo kiểu

Nó hoạt động tốt, nhưng tôi nhận được một cảnh báo Resharper:

Cannot resolve property 'IsSelected' in data context of type "FooSolution.BarViewModel".

Làm thế nào để xác định rõ DataContext loại trên ListBox ItemContainer để thoát khỏi cảnh báo này?

Đây là mã. Tôi có một lớp BarViewModel:

public ObservableCollection<FooViewModel> FooItems { get;set; } 

BarViewModel được gán cho DataContext trong Control chứa ListBox

FooViewModel như sau:

public bool IsSelected 
{ 
    get 
    { 
     return isSelected; 
    } 

    set 
    { 
     if (isSelected == value) 
     { 
      return; 
     } 

     isSelected = value; 
     RaisePropertyChanged(() => IsSelected); 
    } 
} 

và XAML như thế này:

<ListBox ItemsSource="{Binding FooItems}" SelectionMode="Multiple">   
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Cập nhật Tôi đã thử đặt d:DataContext sử dụng một setter, theo đề nghị của HighCore, nhưng unfortunatelly, nó không giúp đỡ và thậm chí phá vỡ xây dựng:

<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/> 

(Ném: Lỗi 1 Thẻ 'DesignInstance' không tồn tại trong không gian tên XML 'schemas.microsoft.com/expression/blend/2008' ;. Dòng 31 Chức 50.)

Cập nhật 2 Finaly, giải pháp là để thiết lập d:DataContext trên các yếu tố phong cách riêng của mình (xem câu trả lời dưới đây của tôi):

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
    </Style> 

Trả lời

15

Như đã chỉ ra bởi @HighCore giải pháp là để xác định d:DataContext thuộc tính từ sự pha trộn SDK, tuy nhiên, nó chỉ làm việc khi thiết lập trên một yếu tố Phong cách itsself, không phải trong setter tài sản :

<ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
     </Style> 
</ListBox.ItemContainerStyle> 

Điều này sẽ loại bỏ cảnh báo của Resharper và cũng thay đổi đường dẫn khi thuộc tính được renaimed trên ViewModel. Mát mẻ!

+0

+1 cả hai chúng tôi đã học được điều gì đó ngày hôm nay =) –

+11

Tôi nhận được lỗi sau: Thuộc tính 'DataContext' không được gắn vào các phần tử kiểu 'Kiểu'. ¿? ¿? ¿ –

+0

@somos, bạn có chắc không, bạn đang sử dụng d: DataContext từ blend SDK (đây là một prop đặc biệt kèm theo để cho phép nhà thiết kế biết về kiểu VM trong thời gian thiết kế) – Isantipov

2

sử dụng d:DataContext như thế này :

<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/> 

Bạn cũng cần sau xmlns es thêm vào phần tử gốc:

 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
+2

Thú vị: Tôi tiếp tục nhận cảnh báo Resharper và giải pháp không biên dịch ngay bây giờ: lỗi sau được kích hoạt: Lỗi Thẻ 'DesignInstance' không tồn tại trong không gian tên XML 'http://schemas.microsoft. com/expression/blend/2008 '. Line 31 Position 50. Tôi có thiếu gì đó không? – Isantipov

+0

Bạn đã thêm 'mc: Ignorable =" d "'? –

+0

Có, tôi đã làm: không giúp đỡ. Bạn đã từng thử thiết lập d: DataContext theo kiểu chưa? – Isantipov

2

Xác định d:DataContext="{d:DesignInstance nmspc:Clz}" với các thuộc tính khác của Style thẻ không giúp tôi: R #/IntelliSense thực sự dừng lại tính tôi đã liên kết với nổi bật nhưng các nhà thiết kế cũng chỉ cho tôi một thông báo lỗi thay vì xem.

Bí quyết tôi phát hiện ra là chỉ định <d:Style.DataContext>bên trong thẻ Style. Và nó có vẻ rất phổ quát đến mức nó trả lời một câu hỏi khác, về việc sử dụng các giao diện như d:DataContext.

Dưới đây là câu trả lời của tôi cho câu hỏi đó với một ví dụ nhỏ: https://stackoverflow.com/a/46637478/5598194

1

bổ sung câu trả lời trước: để thoát khỏi lỗi

Property 'DataContext' is not attachable to elements of type 'Style'

thêm một số không gian tên giả

xmlns:ignore="designTimeAttribute" 

và sử dụng nó ngay bây giờ thay vì d: DataContext

<Style TargetType="{x:Type ListBoxItem}" ignore:DataContext="{d:DesignInstance local:FooViewModel }"> 
... 
</Style> 
+0

Không hiệu quả với tôi. Tôi vẫn gặp lỗi tương tự. –