2015-06-14 128 views
2

我有一個checkbox綁定到一個對象的屬性「IsValidCustomer」,我有一個listview持有一些客戶。 每當我的用戶在列表中選擇任何Customer,我希望CheckboxChecked屬性設置爲False,這意味着我的「IsValidCustomer」屬性也將自動設置爲False。有沒有使用WPF綁定來實現這一點的方法?綁定到屬性和元素值 - WPF綁定

在這方面的任何幫助將高度appriciated。

問候

-Srikanth

回答

0
  • 首先確保你的觀點的Datacontext設置爲viewmodel實現了INotifyPropertyChangedinterface然後添加一個SelectedCustomer屬性,將舉行從ListView選擇Customer

  • 每次設置SelectedCustomer時,檢查它的價值,並設置IsValidCustomer屬性 這裏的全碼:

視圖模型

public class Customer 
{ 
    public String Name { get; set; } 
    public String Id { get; set; } 
} 
public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private Customer _selectedCustomer; 
    public Customer SelectedCustomer 
    { 
     get 
     { 
      return _selectedCustomer; 
     } 

     set 
     { 
      if (_selectedCustomer == value) 
      { 
       return; 
      } 

      _selectedCustomer = value; 
      OnPropertyChanged(); 
      IsValidCustomer = (_selectedCustomer == null); 

     } 
    } 
    private ObservableCollection<Customer> _listCustomers; 
    public ObservableCollection<Customer> ListCustomers 
    { 
     get 
     { 
      return _listCustomers; 
     } 

     set 
     { 
      if (_listCustomers == value) 
      { 
       return; 
      } 

      _listCustomers = value; 
      OnPropertyChanged(); 
     } 
    } 
    private bool _isValidCustomer = false; 
    public bool IsValidCustomer 
    { 
     get 
     { 
      return _isValidCustomer; 
     } 

     set 
     { 
      if (_isValidCustomer == value) 
      { 
       return; 
      } 

      _isValidCustomer = value; 
      OnPropertyChanged(); 
     } 
    } 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

和視圖

<StackPanel> 
    <CheckBox Content="IsValidCustomer" IsChecked="{Binding IsValidCustomer,Mode=TwoWay}"></CheckBox> 
    <ListView ItemsSource="{Binding ListCustomers}" SelectedItem="{Binding SelectedCustomer,Mode=TwoWay}"></ListView>   
</StackPanel> 
0

我相信你有這樣的事情在您的型號:

 private bool _IsValidCustomer; 

    public bool IsValidCustomer 
    { 
     get { return _IsValidCustomer; } 
     set 
     { 
      _IsValidCustomer= value; 
      PropertyChanged(this, new PropertyChangedEventArgs("IsValidCustomer")); 
     } 
    } 

設置該布爾屬性的綁定。

  <Style TargetType="ListViewItem"> 
       <Setter Property="IsSelected" Value="{Binding IsValidCustomer, Converter={StaticResource InverseBooleanConverter}}"/> 
      </Style> 

你的複選框將被綁定到這個也:

<CheckBox IsChecked="{Binding IsValidCustomer, Mode=TwoWay}"/> 

所以,我假設你開始與IsValidCustomer設置爲true。在選擇每一行時,您希望將其設置爲false。

您將需要此相反的布爾轉換器:

public class InverseBooleanConverter: IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (targetType != typeof(bool)) 
      throw new InvalidOperationException("The target must be a boolean"); 

     return !(bool)value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    #endregion 
} 
+0

嗨奧拉魯..看來,這是爲我工作.. excpt,當我選擇複選框或任何一個列表項是選擇所有列表項..不知道爲什麼它..只有改變我所做的是IsValidCustomer屬性是在窗口級別datacontext和列表數據源是客戶的列表,所以,我用FindAncetor來獲取IsValidCustomer ..任何想法爲什麼我所有的列表視圖項目選擇..也,我的listview的視圖並不是真正的listviewitems,而是一個Grid在Listview.view中綁定..感謝您的幫助,至此.. –

+0

@SrikanthAlluri IsValidCustomer應駐留在模型中。這樣,每一行都會有自己的狀態。我認爲你必須區分每個客戶。雖然一個是無效的,其他的可能會是這樣,等等。在Window的上下文中設置,所有的綁定都會引用相同的屬性,我相信這不是你想要的行爲。 –

+0

@SrikanthAlluri還有一件事,也爲Customer類實現INotifyPropertyChanged,並在每個屬性的設置分支上添加PropertyChanged事件。 –