2010-11-04 31 views
20

Tôi muốn kiểm soát khả năng hiển thị của Control A nếu Control B bị ẩn và ngược lại. Ngay bây giờ tôi có chuyển đổi này:Ràng buộc khả năng hiển thị của phần tử khác - và đảo ngược

public class InvertVisibilityConverter : IValueConverter { 

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) { 
     if (targetType == typeof(Visibility)) { 
      Visibility vis = (Visibility)value; 
      return vis == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; 
     } 
     throw new InvalidOperationException("Converter can only convert to value of type Visibility."); 
    } 

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) { 
     throw new Exception("Invalid call - one way only"); 
    } 
} 

Và XAML này:

<Button Visibility="{Binding ElementName=btn1, Path=Visibility, Converter={StaticResource InvertVisibilityConverter}}">Btn2</Button> 

Những công trình. Tôi chỉ tự hỏi nếu có một cách trực tiếp hơn trong WPF/Silverlight để thực hiện điều này? Tôi không ngại có một công cụ chuyển đổi, tôi chỉ muốn chắc chắn rằng không có cách nào tốt hơn tôi không biết.

Trả lời

6

Tóm lại, tôi thấy không có vấn đề gì với những gì bạn đang làm. Điều đó nói rằng, nếu bạn có một tài sản trong ViewModel mà Control A liên kết để kiểm soát khả năng hiển thị của nó, tôi sẽ liên kết Control B với cùng một thuộc tính và đảo ngược visibily thông qua một công cụ chuyển đổi riêng biệt. Tôi không chắc liệu tôi có thể nói rõ lý do tại sao, nhưng điều đó có vẻ tự nhiên hơn với tôi (ít nhất là thay cho bất kỳ bối cảnh bổ sung nào xung quanh những gì bạn đang làm).

+0

Có nhiều ngữ cảnh hơn :) Cảm ơn bạn đã trả lời. –

20

Trong trường hợp này, bạn có thể làm điều đó bằng trình kích hoạt. Ví dụ với hai Nút

<Button Name="button1"> 
    <Button.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=button2, Path=Visibility}" Value="Visible"> 
        <Setter Property="Button.Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
<Button Name="button2"/> 
+1

Cảm ơn câu trả lời. Các kích hoạt phong cách dường như với tôi một chút cồng kềnh hơn so với chuyển đổi, nhưng đó là một vấn đề sở thích cá nhân. –

+0

Tôi đồng ý với bạn. Chỉ cần nghĩ rằng tôi muốn đăng một cách khác để làm điều đó :) –

3

Điều bạn làm là tốt nhưng tôi có xu hướng thích các bộ chuyển đổi tổng quát hơn và để đối xứng với bộ chuyển đổi tích hợp.

Vì vậy, tôi sẽ làm một InverseBooleanToVisibiltyConverter chấp nhận booleans và trả về các loại hiển thị. Điều này phù hợp với BoolenToVisibiltyConverter

Sau đó, tôi sẽ liên kết với thuộc tính IsVisible của nút chứ không phải thuộc tính Hiển thị.

Nhưng đó thực sự là vấn đề ưu tiên.

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