Я нашел несколько вопросов о силимаре, но это не совсем то, что мне нужно. Я хочу привязать значение стека "IsEnabled" для значения "! IsIterrupted" для моих элементов. Вот мой XAML файл:WPF: двухсторонняя привязка данных не работает
<ListView ItemsSource="{Binding Path=Items}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel IsEnabled="{Binding !IsInterrupted, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<Button Command="{Binding Path=StopThreadCommand, Source={StaticResource viewModel}}" CommandParameter="{Binding Id}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Это как элементы выглядит следующим образом:
public class ThreadDecorator : BaseThread , INotifyPropertyChanged
{
...
public event PropertyChangedEventHandler PropertyChanged;
private bool _is_interrupted;
public bool IsInterrupted
{
get { return _is_interrupted; }
set
{
_is_interrupted = value;
OnPropertyChanged("IsInterrupted");
}
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
...
}
И мой ViewModel:
public class ThreadsViewModel : DependencyObject
{
private ThreadsModel _model;
public ThreadsModel Model
{
get { return _model; }
set
{
_model = value;
}
}
public ICollectionView Items
{
get { return (ICollectionView)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(ICollectionView), typeof(ThreadsViewModel), new PropertyMetadata(null));
public StopThreadCommand StopThreadCommand { get; set; }
public ThreadsViewModel()
{
this.Model = new ThreadsModel();
Items = CollectionViewSource.GetDefaultView(Model.Threads);
this.StopThreadCommand = new StopThreadCommand(this);
}
public void InterruptThread(int id)
{
_model.InterruptThread(id);
}
}
StopThreadCommand:
public class StopThreadCommand : ICommand
{
public ThreadsViewModel ViewModel {get; set;}
public StopThreadCommand(ThreadsViewModel viewModel)
{
this.ViewModel = viewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
this.ViewModel.InterruptThread((int)parameter);
}
}
Когда я нажмите кнопку «Стоп», IsInterrupted значение меняется с false на true, а stackpanel должен быть отключен, но пользовательский интерфейс не обновляется. Помоги пожалуйста!
Каков контекст данных панели стека? Вы видите какие-либо ошибки привязки при выполнении этой функции? – Versatile
'! IsInterrupted'? Вы уверены, что '!' Будет работать так, как вы ожидаете? 'Binding.Path' не является произвольным выражением C#. Это строка, именующая свойство DataContext (или свойство одного из его свойств, если «Foo.Bar»). –
Вот несколько решений для привязки к обратному логическому: http://stackoverflow.com/a/1039681/424129 - на самом деле один парень даже написал замену «Binding», которая * делает * позволяет вам сбрасывать логические значения: http://stackoverflow.com/a/27324780/424129 –