1

私のWPFアプリケーションには、3つの列と無効なボタンを持つDataGridが含まれています。私のDataGridの1つの列はDataGridCheckBoxColumnです。次に、 ButtonのIsEnabled-Propertyをバインドして、少なくとも1つがチェックされている場合は有効にし、それ以外の場合は無効のままにします。

実際、私は次の実装を行っています。

<Button x:Name="buttonStart" Content="Start" IsEnabled="{Binding Converter={StaticResource ButtonEnableConverter}, ElementName=gridTestCaseChooser}" />

ただし、Converterは、アプリケーションの起動時に1回だけ呼び出されます。DataGridのコンテンツが変更された場合、またはチェックボックスをオン/オフにした場合、コンバーターへの新しい呼び出しはありません。

どうすればこれを行うことができますか?

4

3 に答える 3

1

あなたのボタンのために:

   IsEnabled="{Binding ElementName=NN, Path=IsChecked}">

質問が更新された後に更新する

ここで説明しているのと同じ状況です。ValueConverterが起動する 原因は何ですか。

アイデアは、実際に自分の状態を変えるものを選択することです

更新しました

次のようなものを試してください:

<dg:DataGrid.Columns> 
   <dg:DataGridTextColumn Header="First Name" Width="50">  
      <dg:DataGridTextColumn.DataFieldBinding> 
         <Binding Path="FirstName" /> 
      </dg:DataGridTextColumn.DataFieldBinding> 
    </dg:DataGridTextColumn> 
    <dg:DataGridCheckBoxColumn Header="Active" Width="50" DataFieldBinding="{Binding Path= IsActive}" /> 
</dg:DataGrid.Columns> 
于 2013-01-23T12:54:11.447 に答える
1

グリッドのような視覚要素ではなく、値が変化しているDependencyPropertyにバインドする必要があります。グリッド自体は通常は変更されません。そのため、コンバーターは起動時に1回だけ呼び出されます。チェックボックスとボタンのあるグリッドを持つUserControlを作成します。そのUserControlは、bool型のDependencyPropertyを定義します。これは、チェックボックスの1つがオンまたはオフの場合にtrueまたはfalseに設定されます。次に、ButtonのIsEnabledプロパティがそのDependencyPropertyにバインドされます。

于 2013-01-23T13:31:20.243 に答える
1

MVVMの使用は非常に簡単です。

  1. プロパティを宣言して、 RelayCommandICommandを使用してボタンのロジックを実行します。
  2. 追加するアイテムはINotifyPropertyChanged、インターフェイスを実装し、boolIsCheckedプロパティ起動PropertyChangedイベントを持っている必要があります。
  3. 新しいアイテムが追加されるたびに、そのPropertyChangedイベントをサブスクライブし、削除されたら、フックも削除します。
  4. フックメソッドが呼び出されるたびPropertyChangedに、ICommandプロパティに対してを起動します。
  5. ICommandXAMLでは、ボタンをプロパティにバインドするだけです。

ViewModels

    public class Item: INotifyPropertyChanged
    {
        private bool isChecked;
        public event PropertyChangedEventHandler PropertyChanged;
        public bool IsChecked
        {
            get
            {
                return this.isChecked;
            }
            set
            {
                this.isChecked = value;
                var propertyChangedEvent = PropertyChanged;
                if(propertyChangedEvent != null)
                {
                    propertyChangedEvent(this, new PropertyChangedEventArgs("UpdateSomething");
                }                
            }
        }
    }

    public class MyViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public ICommand UpdateSomething { get; private set; }
        public ObservableCollection<Item> MyItems { get; set; }

        public MyViewModel()
        {
            UpdateSomething = new RelayCommand(MyCommandExecute, MyCommandCanExecute);
            MyItems = new ObservableCollection<Item>();
        }

        private void MyCommandExecute(object parameter)
        {
            // Your logic here.
        }

        private void MyCommandCanExecute(object parameter)
        {
            return MyItems.Any(item => item.IsChecked);
        }

        private void AddItem(Item item)
        {
            item.PropertyChanged += ItemsPropertyChanged;
            MyItems.Add(item);
        }

        private void ItemsPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            var propertyChangedEvent = PropertyChanged;
            if(propertyChangedEvent != null &&
               e.PropertyName == "IsChecked")
            {
                propertyChangedEvent(this, new PropertyChangedEventArgs("UpdateSomething");
            }                
    }
于 2013-01-24T09:12:38.883 に答える