2010-02-01 37 views
13

Tôi có điều khiển Expander với thuộc tính IsExpanded được liên kết với một bool trong mô hình mvvm. Các ràng buộc hoạt động tốt cho đến khi bạn không chạm vào expander. Khi bạn nhấp vào mũi tên trong giãn nở để mở rộng, liên kết sẽ ngừng hoạt động. Đặt Bool ShowPreview thành false trong mô hình không làm sụp đổ trình giãn nở.WPF Expander IsExpanded binding

<Expander Name="pExpander" 
      IsExpanded="{Binding Path=ShowPreview,Mode=OneWay}" 
      Header="Preview"> 
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>  
</Expander> 
+0

Đối tượng của bạn có thuộc tính ShowPreview thực hiện giao diện INotifyPropertyChanged và tăng sự kiện khi tài sản của bạn bị thay đổi? – mattythomas2000

+1

Chế độ ràng buộc phải là TwoWay. Ngay sau khi bạn mở rộng trên expander, các ràng buộc OneWay sụp đổ và mở rộng là khuôn khổ kiểm soát. – apandit

+0

Cảm ơn! TwoWay hoạt động. Nhưng tại sao nó không thể hoạt động một cách nhanh chóng? Tôi chỉ quan tâm đến mô hình kiểm soát việc mở rộng và sụp đổ dựa trên một sự kiện bên ngoài đặt nó thành sự thật hoặc sai. Nếu khuôn khổ mở rộng hoặc sụp đổ expander tôi không quan tâm đến giá trị đó được thiết lập trở lại trong mô hình. – netraju

Trả lời

7

Nếu bạn xóa Mode=OneWay có khắc phục được sự cố không?

Khi đọc CTQ khác của bạn (các thay đổi đối với GUI không ảnh hưởng đến mô hình), tôi không có gợi ý tốt về cách giới hạn thay đổi đang được xem bởi dữ liệu cơ bản. sự khác biệt trong là gì:

myModel.MyProperty = true; // in *your* code behind 

myModel.MyProperty = true; // done by a binding 
+0

có chế độ xóa = oneway hoạt động. – netraju

0

làm ba điều,

Hãy chắc chắn rằng bạn đang thực hiện ViewModelINotifyPropertyChanged. Ui của bạn sẽ không biết về thay đổi nếu mô hình chế độ xem của bạn không thông báo khi thuộc tính thay đổi

Thay đổi Chế độ thành TwoWay, bạn muốn mô hình xem của mình được cập nhật khi thay đổi mô hình thay đổi

Cuối cùng, nếu hai công cụ trên không hoạt động, hãy sử dụng trình chuyển đổi gỡ lỗi để xác định xem ràng buộc của bạn có bị lỗi hay không. có một ví dụ here về cách thực hiện điều này. Đây là một kỹ thuật mà mọi nhà phát triển wpf đều cần.

Tôi biết có vấn đề với nút radio mà họ sẽ mất liên kết khi nút khác trong nhóm được đặt, tôi không nghĩ đó là vấn đề ở đây, tuy nhiên trình chuyển đổi gỡ lỗi sẽ giúp bạn tìm ra điều này.

+0

Cảm ơn bạn đã trả lời. Có Model thực hiện INotifyPropertyChanged. Các ràng buộc hoạt động tốt miễn là bạn không chạm vào expander. Ngay sau khi bạn nhấp chuột vào giãn nở để mở rộng, ràng buộc không hoạt động nữa. Trong debug bạn có thể thấy rằng IsExpanded được thiết lập là true hoặc false. Nhưng hình ảnh của expander vẫn mở rộng. – netraju

+0

nếu bạn đặt trình chuyển đổi gỡ lỗi vào, trình chuyển đổi gỡ lỗi có bị ảnh hưởng mỗi lần bạn thay đổi trạng thái thu gọn không? –

5

gì bắt tôi ra ở đây là IsExpandedOneWay theo mặc định, vì vậy

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Expanded}"/> 
</Style> 

không làm việc theo cách tôi mong đợi. Chỉ khi bạn thêm Mode=TwoWay, sau đó nó hoạt động (tức là các mục bắt đầu chú ý đến tài sản Expanded của tôi, và cập nhật nó), như trong

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Expanded, Mode=TwoWay}"/> 
</Style> 
1

Với Silverlight Tôi làm điều này:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

<Expander Name="pExpander" IsExpanded="True" Header="Preview"> 
    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}"> 
      <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>  
</Expander> 
<Expander Name="pExpander1" IsExpanded="True" Header="Preview 1"> 
    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}"> 
      <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock Text="{Binding Path=Message1, Mode=OneWay}"></TextBlock>  
</Expander> 
//... 

Các ràng buộc không bị mất khi bạn manualy mở rộng/sụp đổ một Expander ...

+0

Điều duy nhất tôi phải thay đổi cho wpf là trong tùy chọn propertychangedtrigger và value, Binding Path = ShowPreview. Ngoài ra, điều này là hoàn hảo cho tôi, cảm ơn bạn. –