2009-08-19 29 views
12

Tôi đã làm việc với điều khiển ComboBox và không thể lấy SelectedItem được đặt từ thuộc tính trên viewmodel của tôi. Đây là định nghĩa điều khiển:Xác định thuộc tính Silverlight XAML Các vấn đề đặt hàng

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    DisplayMemberPath="FullName"/> 

Tôi có một điều khiển Combobox khác hoạt động tốt. Sự khác biệt giữa một trong đó sẽ thiết lập SelectedItem và một trong đó sẽ không phải là thứ tự của định nghĩa thuộc tính. Dưới đây là định nghĩa kiểm soát làm việc:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    DisplayMemberPath="FullName"/> 

Sự khác biệt giữa 2 là ItemsSource được xác định trước SelectedItem trên làm việc một trong đó dẫn tôi để tin rằng trong trường hợp này ít nhất, thuộc tính để định nghĩa vấn đề. Tôi có thiếu một cái gì đó hoặc có những người khác thấy điều này là đúng? Nó đã được ghi chép ở bất cứ đâu?

Trả lời

15

Có thứ tự có thể quan trọng. Xem xét rằng việc đọc XAML liên quan đến việc tạo ra các đối tượng và gán các giá trị cho các thuộc tính của các đối tượng này. Không thể chỉ định các giá trị thuộc tính cùng một lúc, rõ ràng một thuộc tính sẽ được gán tiếp theo một thuộc tính khác và sau đó một thuộc tính khác cho đến khi tất cả các thuộc tính được gán.

Vì việc gán thuộc tính trong một số đối tượng sẽ dẫn đến các tác dụng phụ và mã khác chạy thứ tự gán các thuộc tính đó có thể ảnh hưởng đến kết quả. Điều này tất nhiên là một điều xấu.

+0

Trong trường hợp này, có nghĩa là không thể chọn một mục trong danh sách nếu danh sách không tồn tại ở vị trí đầu tiên. Đây là một điều khó hiểu khi biết mã hóa Silverlight XAML. Có lẽ các công cụ như Expression Blend đảm bảo các thuộc tính được định nghĩa theo đúng thứ tự? – DaveB

+0

@DaveB: Tôi không chắc lắm, tôi phải tự mình thử nghiệm kịch bản này. Trong cách sử dụng điển hình của tôi cho đến nay bối cảnh dữ liệu được gán cho một số tổ tiên muộn hơn một trong hai thuộc tính trong trường hợp đó, không nên biết thứ tự các thuộc tính này được gán. – AnthonyWJones

+0

Các nguyên tắc nói rằng nó không quan trọng: "KHÔNG cho phép các thuộc tính được đặt theo bất kỳ thứ tự nào ngay cả khi điều này dẫn đến trạng thái không hợp lệ tạm thời của đối tượng." https://msdn.microsoft.com/en-us/library/ms229006%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396 – Wouter

2

Lần tiếp theo bạn gặp vấn đề tương tự như vậy và bạn nghi ngờ ràng buộc có thể không thành công do thứ tự. Kiểm tra cửa sổ đầu ra của bạn, nó hiển thị tất cả các lỗi ràng buộc, Vì vậy, từ lỗi đó bạn có thể đã suy ra rằng ItemSource là null tại thời điểm ràng buộc thuộc tính SelectedItem

+0

Đây là một điểm tuyệt vời. Tôi thậm chí còn không nghĩ đến việc đó. – DaveB

5

Trong mọi trường hợp mà thứ tự thuộc tính được đặt là quan trọng, bạn nên sử dụng cú pháp phần tử, không phải cú pháp thuộc tính, để thể hiện các thuộc tính đó trong XAML của bạn:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" DisplayMemberPath="FullName"> 
    <ComboBox.ItemsSource> 
     <Binding Path="Employees" Mode="OneWay"/> 
    <ComboBox.ItemsSource> 
    <ComboBox.SelectedItem> 
     <Binding Path="EditingJob.Employee" Mode="TwoWay" 
     ValidatesOnExceptions="true" NotifyOnValidationError="true"/> 
    </ComboBox.SelectedItem> 
</ComboBox> 

Theo đề xuất XML, thứ tự các thuộc tính trên một phần tử không đáng kể. Các công cụ XML không bắt buộc phải giữ lại thứ tự chúng xuất hiện. Vì vậy, nếu, ví dụ, bạn đã xử lý phần tử ComboBox này với biến đổi XSLT (không phải là ý tưởng điên rồ trong một số trường hợp), biến đổi có thể thay đổi thứ tự các thuộc tính của bạn, thậm chí nếu nó đang thực hiện <xsl:copy-of>. Bộ xử lý XSLT có thể là sẽ không làm điều này, nhưng không bắt buộc phải không.

Tác dụng nào sẽ ngẫu nhiên hóa thứ tự của các thuộc tính trên mọi phần tử trong XAML của bạn đối với hành vi ứng dụng của bạn? Câu trả lời cho câu hỏi đó phải là "không có gì".

Đây là một khía cạnh của XAML khiến tôi rất lo lắng.

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