2011-01-19 29 views
12

Nếu tôi muốn ràng buộc một cái gì đó giống như một combobox trong code-behind tôi không có vấn đề gì cả. Một cái gì đó như:Có thể tạo một Danh sách <string> tài nguyên tĩnh trong xaml không?

List<string> strings = new List<string>(); 
AddStringsFromDataSourceToList(strings); 

comboBox1.ItemSource = strings; 

Theo như tôi có thể nói, không có cách nào nhanh chóng và bẩn để làm điều này trong XAML. Đối với tất cả các wpf khen ngợi được nhận cho databinding siêu đơn giản của nó, một cái gì đó đơn giản này có vẻ dễ dàng hơn để chỉ cần làm trong C#. Có cách nào dễ hơn để thực hiện việc này hơn là tạo trình bao bọc DependencyProperty và thêm chúng làm tài nguyên mà không cần trợ giúp nhiều từ intellisense hoặc tất cả những gì đi vào ObservableCollections? Tôi hiểu rằng nó không phải là không thể, nhưng tôi phải thiếu một cái gì đó nếu một nhiệm vụ đơn giản như vậy có vẻ như vậy ...

EDIT: Để làm rõ, thêm Danh sách động là vấn đề ở đây, không phải mảng tĩnh. Nó là siêu dễ dàng để thêm các mục thủ công, như nhiều người đã chỉ ra.

+1

WPF được khen ngợi vì thực tế nó độc đáo cho phép phân đoạn logic khỏi thiết kế và vân vân - không phải vì nó có thể làm mọi thứ và bất cứ thứ gì. –

+0

@ Thất vọng- Đây không phải là bất cứ điều gì quá điên ... chắc chắn không phải "bất cứ điều gì và tất cả mọi thứ". Đơn giản và vấn đề conveinence của một trong những nhiệm vụ phổ biến nhất trong việc xây dựng ứng dụng. –

+0

Tôi biết nó không điên; nhưng một khi bạn bắt đầu tự mãn và làm việc theo các dòng 'Tôi sẽ nhúng đoạn dữ liệu này vào giao diện người dùng ...' ai biết nó sẽ kết thúc ở đâu? Và nếu chúng ta đang nói về "dữ liệu" về cơ bản có thể được coi là một phần của giao diện người dùng, như danh sách các tùy chọn thả xuống phổ biến và không đổi, thì thường là vùng chứa được trừu tượng hóa và sử dụng lại. Tôi không nhận được ở bạn, câu hỏi, hoặc phương pháp, chỉ nói một số điều, BTW. –

Trả lời

3

chắc chắn có:

<ComboBox> 
    <ComboBoxItem>One</ComboBoxItem> 
    <ComboBoxItem>Two</ComboBoxItem> 
</ComboBox> 

có cú pháp khác tùy thuộc vào mục tiêu của bạn là gần như rất đơn giản - sử dụng tài nguyên hoặc itemssources nội tuyến, hoặc dữ liệu được nhóm .. thậm chí xml dữ liệu. Đừng ném tay vào sự thất vọng vì điều đầu tiên bạn thử không dễ dàng - wpf đáng để học đường cong, theo ý kiến ​​của tôi. WP2 được khen ngợi bởi vì nó làm cho việc tách hình ảnh khỏi hành vi dễ dàng hơn nhiều so với hình thức cửa sổ, và vì nó tạo ra hiệu ứng hình ảnh tốt đẹp nhiều hơn dễ dàng hơn nhiều, chứ không phải vì nó dễ dàng hơn để làm ví dụ nhỏ. Tuy nhiên, trong trường hợp này - nó dễ dàng hơn để thực hiện ví dụ tầm thường.

Với chỉnh sửa Bạn muốn kéo chúng từ đâu? Bạn không phải tạo các thuộc tính phụ thuộc hoặc các bộ sưu tập quan sát được bằng bất kỳ phương tiện nào. Một thuộc tính danh sách đơn giản sẽ làm (tôi thích sử dụng một collectionviewsource trong xaml trong trường hợp đó).Ngoài ra, đừng quên rằng bạn không cần để sử dụng tất cả XAML nếu bạn ghét nó. Nhưng nếu bạn thiết kế cho WPF thay vì mặc dù nó bạn sẽ tìm thấy rất nhiều nhiệm vụ (như thế này) dễ dàng.

+0

Xin lỗi, tôi không rõ, nhưng tôi đang tìm cách thêm nội dung động (ví dụ: từ Danh sách nơi không biết giá trị). –

+2

@Prof Plum Tôi cho rằng tôi không hiểu - bạn muốn xaml giữ một tài nguyên tĩnh không có mã phía sau, nhưng bạn muốn các giá trị là động? Các giá trị sẽ được đặt ở đâu/khi nào? –

+0

Cảm ơn, phương thức collectionviesource có liên quan gì? Nếu bạn biết về bất kỳ liên kết nào thể hiện việc sử dụng ngắn gọn bên cạnh MSDN, điều đó sẽ khá hữu ích. –

1

Bạn có thể làm:

<ComboBox> 
     <ComboBoxItem>one</ComboBoxItem> 
     <ComboBoxItem>two</ComboBoxItem> 
    </ComboBox> 

Và còn tồn tại cú pháp kê khai (và mặc nhiên tạo) dữ liệu trong ví dụ một phần tài nguyên.

Có thể bạn có thể chỉ ra một kịch bản đầy đủ hơn, với các yêu cầu và hạn chế?

+0

chỉnh sửa để hiển thị những gì tôi đã thực sự nhận được: khi các mục Danh sách không xác định. –

+1

Bây giờ bạn dường như muốn kết hợp C# bắt buộc vào XAML khai báo. Nếu bạn chỉ cần biến hàm thành một thuộc tính bạn đã hoàn thành. –

5

Bạn đang tìm kiếm một cái gì đó như thế này:

<ComboBox> 
    <ComboBox.ItemsSource> 
     <x:Array Type="sys:String" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
     </x:Array> 
    </ComboBox.ItemsSource>     
</ComboBox> 

Nếu bạn chỉ muốn xác định một số mặt hàng để có danh sách, nhìn vào các giải pháp từ Henk Holterman. Nhân tiện, bạn có thể khai báo mảng cũng như tài nguyên và các loại khác.

Cập nhật

Có vẻ như bạn đã thay đổi câu hỏi của bạn. Tuy nhiên tôi không hiểu bây giờ mong muốn của bạn là gì. Nếu bạn muốn để ràng buộc một bộ sưu tập mà bạn có trong bạn code-behind, sau đó tạo ra một tài sản công cộng trả về bộ sưu tập này, đặt DataContext đến đối tượng đó cho thấy nhiều khách sạn này và xác định một ràng buộc trong XAML:

<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"... 

Hope tôi hiểu câu hỏi của bạn đúng ...

33
<Window.Resources> 
    <x:Array x:Key="strings" Type="sys:String" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
    </x:Array> 
    <!-- likewise --> 
    <x:Array x:Key="persons" Type="{x:Type local:Person}" 
      xmlns:local="clr-namespace:namespace-where-person-is-defined"> 
      <local:Person FirstName="Sarfaraz" LastName="Nawaz"/> 
      <local:Person FirstName="Prof" LastName="Plum"/> 
    </x:Array> 
<Window.Resources> 


<ComboBox ItemsSource="{StaticResource strings}" /> 

<ListBox ItemsSource="{StaticResource persons}"> 
    <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock> 
        <Run Text="{Binding FirstName}"/> 
        <Run Text=" "/> 
        <Run Text="{Binding LastName}"/> 
       </TextBlock> 
      </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Tôi muốn có xmlns được xác định ở cấp cửa sổ, ví dụ: '' thay vì trên tài nguyên mảng. Đây là XAML tiêu chuẩn rất sạch sẽ. – cod3monk3y

+0

Chỉ cần đứng đầu, trong xaml của bạn, bạn có , nhưng phải là . Tôi không thể chỉnh sửa vì nó có ít hơn 6 ký tự. – edhedges

+0

@edhedges: Đã sửa lỗi. Cảm ơn. – Nawaz

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