1

I have a UserControlwith I have a DataDridand that in that DataGridI have two ComboBoxes. 今私がやりたいことは、両方から任意のアイテムを選択するとComboBoxes、ボタンの外側にあるボタンDataGridが有効になるはずです。

私はコンボボックスDataGridにバインドされています。ItemSource

使用しようとしましMuliDatatriggersたが、ボタンが外側にあるDataGridため失敗したため、ComboBoxes使用できません。

<DataGrid>
   <DataGrid.Columns>
      <DataGridTemplateColumn Width="Auto">
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <ComboBox Name="Combo1" ItemsSource="{Binding Lst1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Code1" SelectedValue="{Binding CodeID1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">      
               <ComboBox Name="Combo2" ItemsSource="{Binding Lst2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Code2" SelectedValue="{Binding CodeID2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

<Button Name="Add" IsEnabled="{Binding IsAddEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
4

2 に答える 2

2

この質問には、すでに多くの回答が投稿されています。

例:コンボボックス項目が選択されたときにテキスト ボックスを有効にする

より良い方法は、MVVMをアプリケーションに適用することです。

于 2013-07-18T06:57:27.947 に答える
0

wpfで正しく機能する唯一の方法であるMVVMを使用した@MikroDelに同意します。私はこのようなことをしますが、2つのcmbsではなく、データグリッドではありませんが、各コンボで選択したものを設定するため、まったく異なる必要はありませんviewModel のプロパティにインデックスを付け、ボタンについても同じです。

この例では、私はあなたがそれを使用することについてうさぎRelayCommandを読むことができますが、それはこのq件名ではありません.

さらに、インデックス= 0を選択した場合にもボタンが有効になるようなコンバーターを使用するため、非常に簡単に実装できます

 namespace MCSearchMVVM
 {
     class MCBindButtonToComboBox : IValueConverter
     {

         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
         {
            if (value == null) 
               return false;
           return true;
          }

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

さて、実際のものに;)その前の小さなアドバイスは、ビュー(.xamlファイル)とvm(.csファイル)を常に同じフォルダーに配置するのが好きなので、この例が非常に高速である理由です笑

まず、次のビューから始めます。

<UserControl x:Class="MCSearchMVVM.AddFilePage"    
         ...
         xmlns:local="clr-namespace:MCSearchMVVM"
         ...>

<UserControl.Resources>
    <local:MCBindButtonToComboBox x:Key="enableCon"/>
</UserControl.Resources>

<Grid>
    <Grid.ColumnDefinitions>
       ...
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        ...
    </Grid.RowDefinitions>
    <Grid.Background>
        ...
    </Grid.Background>

    <Button Content="Browse.." 
            ...
            Command="{Binding BrowseCommand}"          
            IsEnabled="{Binding FileKindIndexSelected,
                        Converter={StaticResource enableCon}}"
            .../>
    <ComboBox ... SelectedIndex="{Binding FileKindIndexSelected, Mode=TwoWay}" ... >
        ...
    </ComboBox>
   ...
</Grid>

今ViewModel:

public class AddFileViewModel : ObservableObject, IPageViewModel
{
    ...

    private int _fileKindIndexSelected;
    public int FileKindIndexSelected
    {
        get { return _fileKindIndexSelected; }
        set { SetField(ref _fileKindIndexSelected, value, "FileKindIndexSelected");}
    }
    ...
 }

そして SetField 関数

 public abstract class ObservableObject : INotifyPropertyChanged
 {
    [Conditional("DEBUG")]
    [DebuggerStepThrough]
    public virtual void VerifyPropertyName(string propertyName)
    {
        if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        {
            string msg = "Invalid property name: " + propertyName;

            if (this.ThrowOnInvalidPropertyName)
                throw new Exception(msg);
            else
                Debug.Fail(msg);
        }
    }

     protected virtual bool ThrowOnInvalidPropertyName { get; private set; }

     #region INotifyPropertyChanged
    public virtual void RaisePropertyChanged(string propertyName)
    {
        this.VerifyPropertyName(propertyName);
        OnPropertyChanged(propertyName);
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value))
            return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }
    #endregion // INotifyPropertyChanged
 }
}

私はその指示が役に立ったことを願っています..そして私の悪い英語で申し訳ありません=))

于 2013-07-18T08:49:59.437 に答える