2012-04-23 30 views
13

Tôi đã được chơi đùa với WPF cho khá trong một giờ, nhưng lần đầu tiên ngày hôm nay, tôi cần phải làm tổ một MultiBinding bên khác, một cái gì đó như:Nested MultiBinding (s)

<MultiBinding> 
    <Binding />  
    <MultiBinding> 
     <Binding /> 
     <Binding /> 
    </MultiBinding> 
</MultiBinding> 

tôi nhận được một ngoại lệ đó chỉ ra rằng không được phép bởi khuôn khổ:

XamlParseException là unhandled: Thêm giá trị vào bộ sưu tập của loại 'System.Collections.ObjectModel.Collection (System.Windows.Data.BindingBase)' ném một ngoại lệ.

Các InnerException là rõ ràng hơn:

BindingCollection không hỗ trợ các mặt hàng loại MultiBinding. Chỉ cho phép ràng buộc.

Vì vậy, khai thác web để biết thêm thông tin, tôi tình cờ gặp this Microsoft Connect issue đó chính xác là vấn đề của tôi.

Cảm ơn bạn đã phản hồi. WPF không hỗ trợ điều này ngày hôm nay. Tính năng này đã được yêu cầu trong nhiều năm (gần đây nhất là vào đầu tháng này - xem https://connect.microsoft.com/WPF/feedback/details/650164/nested-multibinding). Chúng tôi sẽ tiếp tục xem xét điều này cho các bản phát hành trong tương lai.

Ngay bây giờ, tôi đã làm cho hòa bình của mình rằng tôi sẽ không dễ dàng. Tôi vẫn cần điều này, làm cách nào tôi có thể lồng ghép MultiBindings?

+0

Bạn đang cố gắng làm gì, bạn muốn lồng ghép nhiều nhánh? –

+0

Tôi đang chuyển đổi các giá trị boolean với các thứ tự ưu tiên phức tạp và trong khi một số trong chúng đã là boolean, một số khác cần chuyển đổi đầu tiên và do đó chúng được nhúng vào trong 'IMultiValueConverter' khác. –

+0

Nếu các MultiValueConverters khác của bạn không có nhiều hơn hai giá trị đầu vào, bạn có thể sử dụng công cụ chuyển đổi có tham số thay thế ... hoặc bạn có thể sử dụng trình chuyển đổi có tham số phức tạp để nhập nhiều giá trị, đó là một chút công việc lừa. Nếu điều đó nghe có vẻ khả thi tôi có thể gửi một mẫu? –

Trả lời

0

chỉ cần sử dụng một tính năng đa kết nối với một Bộ đa hợp.

hoặc những gì tôi muốn hiển thị tình trạng của bạn trong một thuộc tính của chế độ xem/datacontext của bạn.

+8

Vâng nhưng điều đó đánh bại toàn bộ mục đích của nó, Nếu tôi cần phải tạo ra một công cụ chuyển đổi mới mà chỉ kết hợp các bộ chuyển đổi khác, và kể từ khi tôi có khoảng một trăm trong số họ ... Đó là rất nhiều boilerplate . –

+0

vâng, nhưng nó sẽ hoạt động;) – blindmeis

+0

Thật vậy, nhưng tôi đang cố gắng sử dụng lại những gì tôi đã có;) –

1

Nếu bạn đang liên kết với một chuỗi bạn có thể sử dụng StringFormat giống như trong ví dụ này:

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding StringFormat="{}{0:0.###}/{1:0.###}" Mode="OneWay"> 
         <Binding ElementName="This" Path="AggregatedDocDetail.ConfirmedQty"></Binding> 
         <Binding ElementName="This" Path="AggregatedDocDetail.Qty"> </Binding> 
     </MultiBinding> 
    </TextBlock.Text> 
    </TextBlock> 
+0

Tôi đang ràng buộc với booleans (xem ý kiến ​​của câu hỏi) và cũng để POCOs. –

4

Nếu bạn có một chuyển đổi mà phải mất một tham số, bạn có thể làm một cái gì đó như thế này:

  • Tạo một lớp để thông qua các dữ liệu "cố định" để chuyển đổi của bạn
  • Thêm DependencyProperties đến lớp (để bạn có thể liên kết các giá trị trong XAML)
  • Trong XAML của bạn, sử dụng một ràng buộc với một chuyển đổi thay vì một multibinding, một cái gì đó như thế này:

    <MultiBinding> 
        <Binding Source="SomeObject" Path="CoreValue" Converter="{StaticResource YourNewConverter}"> 
         <Binding.ConverterParameter> 
          <ns:ParameterClass Value1="{Binding Parameter1}" Value2="{Binding Parameter1}" /> 
         </Binding.ConverterParameter> 
        </Binding> 
    .... 
    

Giới hạn là (AFAIK) giá trị sẽ chỉ được tính toán lại nếu CoreValue thay đổi - nó đã giành sẽ không tự động rebind nếu các thông số chuyển đổi thay đổi.

(Xin lỗi cho bất kỳ lỗi nào, tôi đang gõ những dòng này mà không có sự lợi ích của VS để thử nghiệm trong ...)

+0

Tôi nghĩ rằng đó là một ý tưởng hợp lệ, nhưng sẽ mất quá nhiều thời gian để tối ưu hóa với kế thừa DataContext để các thuộc tính của ParameterClass có thể bị ràng buộc. –

4

tôi nhận ra rằng đây là một câu hỏi cũ bây giờ, nhưng tôi chỉ cần nhấn chính xác cùng một vấn đề như OP.May mắn thay trong trường hợp của tôi, tôi có thể liên kết với một phần tử phụ mà kết quả của đa ràng buộc đã được tính toán, nhưng nó đã cho tôi suy nghĩ ...

Một (mặc dù thừa nhận không phải là rất sạch) giải pháp sẽ được viết giá trị của liên kết nhiều giá trị thành thuộc tính 'rảnh' như 'Thẻ' của phần tử mà sau đó bạn có thể tham chiếu trong các liên kết đa giá trị khác bằng cách chỉ định thuộc tính 'ElementName'.

Nếu bạn cần nhiều hơn một liên kết nhiều giá trị lồng nhau thì bạn có thể tạo đối tượng 'giả' với một số thuộc tính phụ thuộc trên đó để lưu trữ nhiều kết quả trung gian.

Một điều đáng tiếc là Microsoft không triển khai đúng hệ thống lồng nhau ...