2013-07-18 56 views
1

我有一個UserControl其中我有一個DataDrid在那DataGrid我有兩個ComboBoxes。現在我想要做的是當我從ComboBoxes中選擇任何項目時,DataGrid之外的按鈕應該啓用。Button Enablity WPF

我的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}"/> 
+0

Farzi - 如果答案對你有幫助 - 請把它提出來。如果是解決方案 - 也接受它 – MikroDel

+0

因爲今天你有6個問題和0接受答案! – MikroDel

+0

不是。您提供的網址並不回答我的問題。我的按鈕位於Datagrid之外,所以通過使用DataTriggers和爲Combobox提供元素名稱將無濟於事,因爲它們位於datagrid中,而按鈕位於dataGrid之外,所以它不會起作用。但是如果我們可以使用Relative source屬性,可能會有所幫助..但我不知道如何在數據觸發器中使用它,因爲每當我使用它時,都會給我一個例外 – Vishal

回答

0

我與MVVM @MikroDel同意辦法就在WPF工作..我的財產以後這樣的而不是有兩個CMBS,而不是在數據網格但並不需要是不同的,因爲在所有的每個組合在viewModel中將所選索引設置爲屬性,對於按鈕也是如此。

在這個例子中,我使用RelayCommand你可以閱讀hare關於使用它,但不是這個q主題。如果選擇指數

另外我用一個轉換器「Like按鈕的原因也使= 0,因此implementd很簡單

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文件)在同一個文件夾中,這就是爲什麼我覺得這個例子非常快笑

首先我們begon這樣的觀點:

<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> 

現在視圖模型:

public class AddFileViewModel : ObservableObject, IPageViewModel 
{ 
    ... 

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

而且SetField FUNC

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 
} 
} 

我希望的方向是有幫助.. 而且對不起,我的英語不好=))

相關問題