2012-08-29 43 views
0

爲了縮短比例,我們假設我有一個帶有組合框的Datagrid和一個組合框。我想根據我的視圖模型與第一組合選擇Silverlight DataGrid顯示或隱藏選擇組合框的控件

   <sdk:DataGridTemplateColumn.CellTemplate> 
              <DataTemplate> 
               <Grid> 
                <Grid.ColumnDefinitions> 
                 <ColumnDefinition /> 
                 <ColumnDefinition/> 
                </Grid.ColumnDefinitions> 
                <ComboBox x:Name="cboThenConstOrCol" SelectedIndex="0" SelectedItem="{Binding Source={StaticResource VM}, Path=cboElseSelectedItem, Mode=TwoWay}"> 
                 <ComboBoxItem Content="None"/> 
                 <ComboBoxItem Content="Const" /> 
                 <ComboBoxItem Content="Col"/> 
                </ComboBox> 
                <TextBox Grid.Column="1" Text="{Binding ElseConst}" Visibility="{Binding Source={StaticResource VM}, Path= IsVisibleElseConst}" IsTabStop="{Binding Source={StaticResource VM}, Path=isElseConstTabStop}"></TextBox> 
                <ComboBox Grid.Column="1" ItemsSource="{Binding Source={StaticResource VM}, Path=Fields,Mode=OneWay}" Visibility="{Binding Source={StaticResource VM}, Path= IsVisibleElseCol}" DisplayMemberPath="FieldName" /> 
               </Grid> 
              </DataTemplate> 
             </sdk:DataGridTemplateColumn.CellTemplate> 

我正在照顧顯示或隱藏的和正常工作的值顯示或隱藏文本或組合框,但問題是當我使文本框可見時,所有行中的所有文本框都可見。我想要的僅適用於組合框selecteditem已更改的行。我希望我很清楚,否則請讓我知道添加更多信息。謝謝

回答

1

從我可以收集你有一個ViewModel控制一切。我認爲你會遇到這樣的問題,雖然看起來比較容易,但首先這樣做並不是在引入任何複雜度的情況下。我所要做的就是更多地接受MVVM,併爲您的每行代表的項目製作一個ViewModel。這允許每行保持它自己的狀態。下面是根據您所提供的內容的示例:

修改XAML(不完全):

<UserControl.Resources> 
    <local:VM 
     x:Key="vm" /> 
</UserControl.Resources> 
<Grid 
    DataContext="{StaticResource vm}" 
    x:Name="LayoutRoot" 
    Background="White"> 
    <sdk:DataGrid 
     AutoGenerateColumns="False" 
     ItemsSource="{Binding Items}"> 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridTemplateColumn> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition 
            Width="100" /> 
           <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <ComboBox 
           ItemsSource="{Binding Source={StaticResource vm}, Path=Options}" 
           SelectedItem="{Binding Selected, Mode=TwoWay}" /> 
          <TextBox 
           Grid.Column="1" 
           Text="Else" 
           Visibility="{Binding TextVisible}" /> 
         </Grid> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 
     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
</Grid> 

項目是一個包含「ItemViewModel的集合。這裏的主要變化是數據模板中的綁定現在映射到'ItemViewModel'的屬性。這個例外是ComboBox的ItemSource(包含'None','Const'和'Col'值),它綁定到主虛擬機。

主要VM:

public class VM : INotifyPropertyChanged 
{ 
    private readonly ObservableCollection<ItemViewModel> items = new ObservableCollection<ItemViewModel>(); 
    private readonly ObservableCollection<string> options = new ObservableCollection<string>(); 

    public ObservableCollection<ItemViewModel> Items { get { return items; } } 
    public ObservableCollection<string> Options { get { return options; } } 

    public VM() 
    { 
     options.Add("None"); 
     options.Add("Const"); 
     options.Add("Col");  

     //Create some dummy items 
     for (int i = 0; i < 10; i++) 
     { 
     var item = new ItemViewModel(); 
     item.Name = i.ToString(); 
     item.Selected = options[0]; 
     items.Add(item); 
     } 
    } 

    //INotifyPropertyChanged stuff 

項目VM:

public class ItemViewModel : INotifyPropertyChanged 
{ 
    private string selected; 
    private Visibility textVisible; 

    public string Selected 
    { 
     get { return selected; } 
     set 
     { 
     if (!string.IsNullOrWhiteSpace(value)) 
     { 
      switch (value.ToLower()) 
      { 
      case "none": 
       TextVisible = Visibility.Collapsed; 
       break; 
      case "const": 
       TextVisible = Visibility.Visible; 
       break; 
      case "col": 
       TextVisible = Visibility.Visible; 
       break; 
      } 
     } 

     selected = value; 

     } 
    } 

    public Visibility TextVisible 
    { 
     get { return textVisible; } 
     set 
     { 
     textVisible = value; 
     RaisePropertyChanged("TextVisible"); 
     } 
    } 

    //INotifyPropertyChanged stuff  

} 

你可以在這裏看到,當選擇的值更改爲這個項目,一些邏輯運行,以確定文本是否應該可見與否。

這有一些錯誤,但希望它能讓你走上正確的道路。

+0

謝謝Wdavo。你是絕對正確的我的虛擬機代碼開始變得非常大(近2000行代碼)。這個網格實際上是RowDetailTemplate的一部分。我將在幾個文件和VM類中分離我的代碼。再次感謝 –