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



为了缩短,假设我有一个带有组合框的Datagrid、一个TextBox和另一个combobox。我想根据第一个组合选择的值显示或隐藏文本或组合框

               <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中,我负责显示或隐藏,并且工作正常,但问题是当我使文本框可见时,所有行中的所有文本框都变为可见。我只想应用于组合框selecteditem已更改的行。我希望我清楚,否则请让我知道添加更多信息。感谢

据我所知,您有一个ViewModel可以控制一切。我认为你在做这件事时会遇到问题,虽然一开始做这样的事情看起来更容易,但当引入任何复杂性时,肯定不会。我要做的是更多地接受MVVM,并为每个Row所代表的项目创建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"one_answers"Col"值),它绑定到主VM。

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

您可以在这里看到,当更改此项的选定值时,会运行一些逻辑来确定文本是否可见。

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

最新更新