2016-08-04 85 views
0

我在XAML中具有以下綁定,其中IsEnabled是bool類型,而Length是int類型的屬性,類型爲int。將int屬性綁定到bool UIElement

<Button 
     Content="Press Me" 
     IsEnabled="{Binding MyArray.Length, FallbackValue=False}"> 
</Button> 

它做我想做的事情,當數組長度爲0時,它禁用,當數組包含啓用的元素時。

但是,我沒有期待它的工作,因爲你不能在int中隱式地將int轉換爲bool。

這是安全嗎?

+1

它禾rks表示數組爲空時IsEnabled設置爲false?更好地使用綁定轉換器。 – Clemens

+0

同意,根據你的數組長度,使用'IValueConverter'或者在ViewModel上有一個屬性返回布爾值。 – Michael

回答

1

這是安全嗎?

總之,是的,它是安全的 - 因爲你有一個FallbackValue,如果綁定失敗。


你可以使用一個良好的醇」 DataTrigger
我已經在WPF忘記了他們(我已經工作的WinRT最近很多 - 他們是不可用在)

這將綁定觸發您的Length,然後當條件滿足 - 按鈕的IsEnabled屬性設置爲(在這種情況下)false

<Button Content="Press Me"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyArray.Length}" Value="0"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

綁定到你的視圖模型一個bool

你也對你的ViewModel在此使用public bool屬性,然後基地的IsEnabled

public bool IsEnabled { get { return MyArray.Length > 0; } } 

和在你的Xaml中:

<Button 
    Content="Press Me" 
    IsEnabled="{Binding IsEnabled}}"> 
</Button> 

使用的IValueConverter
最好的選擇使用WinRT的

你也可以創建和使用Converter它可以根據你的後病情給予回boolean任何人。

請參閱http://wpftutorial.net/ValueConverters.html瞭解如何在您的WPF中實現轉換器的教程。

A轉換器實現IValueConverter,而且會是這個樣子:

public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Do the conversion from bool to visibility 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Do the conversion from visibility to bool 
    } 
} 

不要忘記引用它在你的用戶控件/視圖 - 甚至在你App.xaml爲了使用它作爲一個StaticResource

例子?

根據您自己的邏輯,您可以根據自己的邏輯解釋自己的轉換器。

在這種情況下,你可以創建一個轉換器,並在XAML中使用它,就像這樣:

您可以創建一個ArrayNotNullOrEmptyToBooleanConverter,並用它在XAML中,像這樣:

<Button 
    Content="Press Me" 
    IsEnabled="{Binding MyArray, Converter={Binding ArrayNotNullOrEmptyToBooleanConverter}}"> 
</Button> 

或者只是簡單地創建一個IsGreaterThanZeroToBooleanConverter,然後使用在XAML中,像這樣:

<Button 
    Content="Press Me" 
    IsEnabled="{Binding MyArray.Length, Converter={Binding IsGreaterThanZeroToBooleanConverter}}"> 
</Button> 

希望這有助於! :)

+0

我想問題是,爲什麼我更好地創建一個轉換器? –

+0

完全是我的錯 - 我忘記了WPF中的老數據DataTrigger - 我已經更新了我的答案。至少你有幾個建議,從:) –

+1

作出決定你很剽竊我的答案。 – Clemens

3

此行爲似乎沒有記錄在任何地方,所以你不應該依賴它。

安全和簡單的解決辦法是用一個DataTrigger一個風格:

<Button Content="Press Me"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyArray.Length}" Value="0"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
+0

你說什麼它沒有被記錄在任何地方,是我改變它的一個很好的理由,謝謝你的注意。 –

1

我不相信這是可行的,但它確實

零是假的,其他的一切都是真實的

所有人都可以認爲,它把它當作一個零點來對待,而其他的數字都是1並且是真的。
這就是MS SQL Server中的工作原理。

我不知道你可以指望在將來的.NET版本中。

我的工作,即使
我上一個TextBox測試後備
如果我給它的名聲像三這不是連拋綁定錯誤
是不會拋出一個綁定錯誤
如果綁定一個字符串,它拋出一個綁定錯誤

<TextBox Grid.Row="0" Grid.Column="0" 
     IsEnabled="{Binding ii}" PresentationTraceSources.TraceLevel="High" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     Text="TexBox" /> 

public int ii { get { return 0; } } 

,或者你可能只是這樣做

public bool iiEnabled { get { return arrayLength > 0; } } 
+0

你是否測試了綁定到一個int。它確實有效。 – Paparazzi

+0

我不知道爲什麼downvote,但 - 但我同意你的理論。我的想法是,它可能正在使用'0'或'1'位邏輯 –