我有一個checkbox
綁定到一個對象的屬性「IsValidCustomer
」,我有一個listview
持有一些客戶。 每當我的用戶在列表中選擇任何Customer
,我希望Checkbox
Checked
屬性設置爲False
,這意味着我的「IsValidCustomer
」屬性也將自動設置爲False
。有沒有使用WPF綁定來實現這一點的方法?綁定到屬性和元素值 - WPF綁定
在這方面的任何幫助將高度appriciated。
問候
-Srikanth
我有一個checkbox
綁定到一個對象的屬性「IsValidCustomer
」,我有一個listview
持有一些客戶。 每當我的用戶在列表中選擇任何Customer
,我希望Checkbox
Checked
屬性設置爲False
,這意味着我的「IsValidCustomer
」屬性也將自動設置爲False
。有沒有使用WPF綁定來實現這一點的方法?綁定到屬性和元素值 - WPF綁定
在這方面的任何幫助將高度appriciated。
問候
-Srikanth
首先確保你的觀點的Datacontext
設置爲viewmodel
實現了INotifyPropertyChanged
interface
然後添加一個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>
我相信你有這樣的事情在您的型號:
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
}
嗨奧拉魯..看來,這是爲我工作.. excpt,當我選擇複選框或任何一個列表項是選擇所有列表項..不知道爲什麼它..只有改變我所做的是IsValidCustomer屬性是在窗口級別datacontext和列表數據源是客戶的列表,所以,我用FindAncetor來獲取IsValidCustomer ..任何想法爲什麼我所有的列表視圖項目選擇..也,我的listview的視圖並不是真正的listviewitems,而是一個Grid在Listview.view中綁定..感謝您的幫助,至此.. –
@SrikanthAlluri IsValidCustomer應駐留在模型中。這樣,每一行都會有自己的狀態。我認爲你必須區分每個客戶。雖然一個是無效的,其他的可能會是這樣,等等。在Window的上下文中設置,所有的綁定都會引用相同的屬性,我相信這不是你想要的行爲。 –
@SrikanthAlluri還有一件事,也爲Customer類實現INotifyPropertyChanged,並在每個屬性的設置分支上添加PropertyChanged事件。 –