2016-07-05 60 views
-1

所以我有一個組合框綁定到項目列表。 {A,B,C,D,E}TextBox isEnabled綁定依賴於組合框項目

<ComboBox x:Name="cmbDMS" ItemsSource="{Binding Types}" SelectedValue="{Binding Type,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" SelectionChanged="cmbDMS_SelectionChanged" /> 

也是一個TextBox。

<TextBox IsEnabled="{Binding isTypeB}" Grid.Row="6" Width="250" Margin="0,2" /> 

我無法弄清楚如何,一旦組合框的SelectedValue已更改爲B.它的工作原理,一旦我離開,回來到視圖,但我希望它是即時更新的文本框IsEnabled屬性。

謝謝。

+0

什麼是 「isTypeB」?你有沒有誤認爲[另一個網站](http://www.psychicfriendsnetwork.com)? –

回答

1

我過去遇到過一些問題,需要綁定到SelectedValue,並且正確地引發事件。除非你有一個明確的原因,我喜歡綁定到SelectedItem

我有這個操作中發現的問題,是對bool對象的約束力並不一定會獲得通過ComboBox

SelectedItem的變化更新

如果你想被鏈接的兩個,一個簡單的方法做,這是對屬性格式的二傳手內提高屬性更改事件爲bool isTypeB屬性:

(因爲我不知道的類型「類型」我會認爲它是一個字符串):

public string Type 
{ 
    get{...} 
    set 
    { 
    //...set logic 
    RaisePropertyChanged(); //will notify when "Type" changes 
    RaisePropertyChanged("isTypeB"); //will notify that isTypeB is changed 
    } 
} 
... 
public bool isTypeB => Type == "TypeB"; 

參考了RaisePropertyChanged

public event PropertyChangedEventHandler PropertyChanged; 

    public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
0

如果您的綁定是第一次,後來它不會,那麼您關於更改屬性的通知可能不起作用。所以確保你綁定到屬性是DependencyProperty,或者在你的setter中引發PropertyChanged事件(INotifyPropertyChanged接口的成員)。

2

我做了一個樣本,爲您瞭解它。 由於它更多的是基於視圖的東西,我建議使用轉換器並將代碼包含在視圖和轉換器中。請參閱下面的代碼。我測試了它,它在我的最後工作正常。

當您選擇B時,文本框處於啓用狀態,當選擇更改爲任何其他文本框時,文本框將被禁用。

XAML代碼:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    xmlns:viewModel="clr-namespace:WpfApplication1.ViewModel" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" > 
    <Window.Resources> 
     <viewModel:TestConverter x:Key="TestConverter" /> 
    </Window.Resources> 
    <Grid Margin="329,0,0,0"> 
     <ComboBox x:Name="cmbDMS" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" > 
      <ComboBoxItem Content="A"/> 
      <ComboBoxItem Content="B"/> 
      <ComboBoxItem Content="C"/> 
      <ComboBoxItem Content="D"/> 
      <ComboBoxItem Content="E"/> 
     </ComboBox> 
     <TextBox Grid.Row="6" Height="60" Width="250" Margin="0,2" IsEnabled="{Binding ElementName=cmbDMS, Path=Text, Converter={StaticResource TestConverter}}" /> 
    </Grid> 
</Window> 

TestConverter.cs代碼:

using System; 
using System.Globalization; 
using System.Windows.Data; 

namespace WpfApplication1.ViewModel 
{ 
    public class TestConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value != null) 
      { 
       var si = value.ToString(); 
       if (si.Equals("B")) 
        return true; 
      } 
      return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
}