2015-07-16 5 views
4

Это моя кнопка заявление, написанное в .xaml файле:Кнопка IsEnabled никогда не меняется

<dxlc:LayoutGroup Orientation="Horizontal" Margin="5,15,0,5"> 
    <Grid MinWidth="100"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <Button 
      IsEnabled="{Binding IsSearchCriteriaHasValue}" 
      Content="Search" 
      MaxHeight="25" 
      MaxWidth="70" 
      ClipToBounds="True" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center" 
      HorizontalContentAlignment="Center"     
      VerticalContentAlignment="Center" 
      Command="{Binding SearchCommand}"/> 
    </Grid> 
</dxlc:LayoutGroup> 

Это функция, которая возвращает истина/ложь ли пользователь вводит какой-либо текст для поиска в поле поиска рядом с кнопка поиска. Функция находится в другом .cs файле:

public bool isButtonEnabled 
{ 
    return (SearchBox.Selection.Count > 0); 
} 

Проблема заключается в том, что значение IsEnabled никогда не меняется, он остается верным, то есть кнопка остается включен все время, или если изменить знак>, то кнопка будет все время отключается. Какие-либо предложения?

ответ

6

В IsSearchCriteriaHasValue потребности поднять событие, что оно изменилось, вы можете сделать это с помощью INotifyPropertyChanged интерфейса:

public class Customer : INotifyPropertyChanged 
{ 
    // INotifyPropertyChanged members 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

    // Your property 
    private string _Name; 

    public string Name 
    { 
     get 
     { 
      return _Name; 
     } 
     set 
     { 
      _Name = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Name")); 
     } 
    } 
} 
1

Не проблема с XAML, его проблема с уведомлением. Надеюсь, вам известно о событии NotifyPropertyChanged для интерфейса INotifyProperty. Только если это вызвано для свойства в ViewModel, пользовательский интерфейс получит уведомление и обновит его.

Если значение SearchBox.Selection изменяется, оно не вызывает никаких уведомлений о свойстве IsSearchCriteriaHasValue, которое было изменено, и пользовательский интерфейс должен обновляться.

Скажем, SearchBox.Selection привязан к наблюдаемому набору, и коллекция изменяет, а затем подписывается на наблюдаемый набор для добавления/удаления, затем запускает NotifyPropertyChanged("IsSearchCriteriaHasValue"); там.

-1

Binding работы по недвижимости измененного мероприятия. Ваш ViewModel должен реализовать интерфейс INotifyPropertyChanged. И вам нужно поднять свойство измененное событие в наборе свойств. Или просто вы можете использовать delegate command и логику блокировки записи в CanExecute Method. смотрите по этой ссылке для получения дополнительной информации http://www.codeproject.com/Questions/179129/MVVM-Enable-Disable-button-via-a-PropertyChanged-e

2

Вы можете написать триггер для кнопки (SearchBox выглядит элемент управления UI)

<Style TargetType="Button"> 
    <Setter Property="IsEnabled" Value="True" /> 
    <Style.Triggers>  
    <DataTrigger Binding="{Binding Selection.Count, ElementName=SearchBox}" Value="0"> !-- You can use convertor also 
    <Setter Property="IsEnabled" Value="False" /> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> </Button.Style> </Button> 
1

Переплётных работы по недвижимости измененного мероприятия. Ваш ViewModel должен реализовать интерфейс INotifyPropertyChanged.

https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

Exemple:

// This form demonstrates using a BindingSource to bind 
// a list to a DataGridView control. The list does not 
// raise change notifications. However the DemoCustomer type 
// in the list does. 
public partial class Form1 : Form 
{ 
    // This button causes the value of a list element to be changed. 
    private Button changeItemBtn = new Button(); 

    // This DataGridView control displays the contents of the list. 
    private DataGridView customersDataGridView = new DataGridView(); 

    // This BindingSource binds the list to the DataGridView control. 
    private BindingSource customersBindingSource = new BindingSource(); 

    public Form1() 
    { 
     InitializeComponent(); 

     // Set up the "Change Item" button. 
     this.changeItemBtn.Text = "Change Item"; 
     this.changeItemBtn.Dock = DockStyle.Bottom; 
     this.changeItemBtn.Click += 
      new EventHandler(changeItemBtn_Click); 
     this.Controls.Add(this.changeItemBtn); 

     // Set up the DataGridView. 
     customersDataGridView.Dock = DockStyle.Top; 
     this.Controls.Add(customersDataGridView); 

     this.Size = new Size(400, 200); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // Create and populate the list of DemoCustomer objects 
     // which will supply data to the DataGridView. 
     BindingList<DemoCustomer> customerList = new BindingList<DemoCustomer>(); 
     customerList.Add(DemoCustomer.CreateNewCustomer()); 
     customerList.Add(DemoCustomer.CreateNewCustomer()); 
     customerList.Add(DemoCustomer.CreateNewCustomer()); 

     // Bind the list to the BindingSource. 
     this.customersBindingSource.DataSource = customerList; 

     // Attach the BindingSource to the DataGridView. 
     this.customersDataGridView.DataSource = 
      this.customersBindingSource; 

    } 

    // Change the value of the CompanyName property for the first 
    // item in the list when the "Change Item" button is clicked. 
    void changeItemBtn_Click(object sender, EventArgs e) 
    { 
     // Get a reference to the list from the BindingSource. 
     BindingList<DemoCustomer> customerList = 
      this.customersBindingSource.DataSource as BindingList<DemoCustomer>; 

     // Change the value of the CompanyName property for the 
     // first item in the list. 
     customerList[0].CustomerName = "Tailspin Toys"; 
     customerList[0].PhoneNumber = "(708)555-0150"; 
    } 

} 

// This is a simple customer class that 
// implements the IPropertyChange interface. 
public class DemoCustomer : INotifyPropertyChanged 
{ 
    // These fields hold the values for the public properties. 
    private Guid idValue = Guid.NewGuid(); 
    private string customerNameValue = String.Empty; 
    private string phoneNumberValue = String.Empty; 

    public event PropertyChangedEventHandler PropertyChanged; 

    // This method is called by the Set accessor of each property. 
    // The CallerMemberName attribute that is applied to the optional propertyName 
    // parameter causes the property name of the caller to be substituted as an argument. 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    // The constructor is private to enforce the factory pattern. 
    private DemoCustomer() 
    { 
     customerNameValue = "Customer"; 
     phoneNumberValue = "(312)555-0100"; 
    } 

    // This is the public factory method. 
    public static DemoCustomer CreateNewCustomer() 
    { 
     return new DemoCustomer(); 
    } 

    // This property represents an ID, suitable 
    // for use as a primary key in a database. 
    public Guid ID 
    { 
     get 
     { 
      return this.idValue; 
     } 
    } 

    public string CustomerName 
    { 
     get 
     { 
      return this.customerNameValue; 
     } 

     set 
     { 
      if (value != this.customerNameValue) 
      { 
       this.customerNameValue = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    public string PhoneNumber 
    { 
     get 
     { 
      return this.phoneNumberValue; 
     } 

     set 
     { 
      if (value != this.phoneNumberValue) 
      { 
       this.phoneNumberValue = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 
} 

}