2015-06-11 24 views
0

在我的主Window中,我有一個MenuItemUserControl。如果UserControl中的TextBoxes之一分別爲空/非空,我想禁用/啓用MenuItem當UserControl的TextBox爲空時禁用MenuItem

給定一個名爲UserControlContactDetails一個叫ContactNameTextBoxTexBox,這裏是爲MenuItem我的XAML代碼:

<MenuItem x:Name="DeleteContact" 
      Header="Delete Contact" 
      IsEnabled="{Binding ElementName=ContactDetails.ContactNameTextBox,Path=Text.Length, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

出於某種原因,MenuItem始終保持啓用狀態。我錯過了什麼?

回答

0

您正在綁定到文本的長度,但您需要一個從長度到布爾的轉換器,因爲IsEnabled屬性需要布爾值。

public class NumToBoolConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value!=null && value is int) 
     { 
      var val = (int)value; 
      return (val==0) ? false : true; 
     } 
     return null; 
    } 


    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value!=null && value is bool) 
     { 
     var val = (bool)value; return val ? 1 : 0; 
     } 
     return null; 
    } 
} 

爲此和資源添加一個本地xmlns。

xmlns:local="clr-namespace:YourNamespace" 

這是對轉換器類的引用。

<local:NumToBoolConverter x:Key="NumToBoolConverter"/> 

在您的Binding部分補充一點:

Converter={StaticResource NumToBoolConverter} 

這可能是你最後的菜單項定義:

 <MenuItem x:Name="DeleteContact" 
        Header="Delete Contact" 
        IsEnabled="{Binding ElementName=ContactDetails.ContactNameTextBox, 
             Path=Text.Length, 
             Converter={StaticResource NumToBoolConverter}, 
             Mode=TwoWay, 
             UpdateSourceTrigger=PropertyChanged}"/> 
0

有與你結合一對夫婦的問題。首先是你指定了一個雙向綁定。這意味着你想回寫到文本框中的'length'屬性。既然它是隻讀的,你不能。

通常你應該得到這樣的錯誤:

一雙向或OneWayToSource結合不能在類型「System.String」的只讀屬性 「長度」工作。

現在奇怪的是,綁定確實在那之後工作。但這真的不是正確的方法。 .NET的魔力是讓0被解釋爲'假'。但它不是一個安全的約束。正如奧拉魯在他的回答中所說的,length屬性是一個整數,IsEnabled字段正在尋找一個布爾值。如果你想綁定到'可見性'屬性呢?

那麼處理這個問題的最好方法是什麼呢?轉換器絕對是一種選擇,在許多情況下是最好的選擇。轉換器的優點是它們可以在類似情況下重新使用。我們有一個庫,裏面裝滿了我們經常使用的轉換器。奧拉魯已經描述瞭如何做到這一點,所以我不會重複他已經說過的話。

但在某些情況下,瞭解不同的方式是有益的。一個數據觸發器將允許你做和轉換器一樣的東西。這是一種單向綁定。這是一個例子。

<MenuItem x:Name="DeleteContact" Header="Delete Contact"> 
    <MenuItem.Style> 
     <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}"> 
     <Setter Property="MenuItem.IsEnabled" Value="true"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Text.Length, ElementName=ContactNameTextBox}" Value="0"> 
       <Setter Property="MenuItem.IsEnabled" Value="false"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </MenuItem.Style> 
    </MenuItem> 

無需代碼!!

關於轉換器和數據觸發器的優點和缺點有很多爭論。但主要的是要知道有多種方法可以做你所要求的。

相關問題