Silverlight数据网格使用组合框选择显示或隐藏控件

时间:2012-08-29 00:46:18

标签: silverlight datagrid

为了缩短,假设我有一个带有组合框的Datagrid和一个TextBox,以及另一个Combobox。我想根据第一个Combo

选择的值显示或隐藏文本或组合框
               <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>

在我的Viewmodel中我正在处理显示或隐藏并且工作正常,但问题是当我使文本框可见时,所有行中的所有文本框都变得可见。我想要的只是应用于组合框选择项已被更改的行。我希望我很清楚,否则请让我知道添加其他信息。感谢

1 个答案:

答案 0 :(得分: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>

Items是包含'ItemViewModel'的集合。这里的主要变化是数据模板中的绑定现在映射到'ItemViewModel'的属性。例外情况是ComboBox的ItemSource(包含你的'None','Const'和'Col'值),它们绑定到主虚拟机。

主虚拟机:

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       

}

您可以在此处看到,当为此项目更改选定值时,会运行一些逻辑来确定文本是否应该可见。

这有一些问题,但希望它能让你走上正确的道路。