0

为了更短,假设我有一个带有组合框、文本框和另一个组合框的 Datagrid。我想根据第一个 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 中,我正在处理显示或隐藏并且工作正常,但问题是当我使文本框可见时,所有行中的所有文本框都变得可见。我想要的只是应用于组合框选定项已更改的行。我希望我很清楚,否则请让我知道添加其他信息。谢谢

4

1 回答 1

1

据我所知,您有一个可以控制一切的 ViewModel。我认为这样做会遇到问题,虽然一开始这样做似乎更容易,但绝对不是在引入任何复杂性时。我要做的是更多地拥抱 MVVM,并为每个 Rows 代表的项目创建一个 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' 值),它绑定到 Main 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   

项目虚拟机:

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       

}

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

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

于 2012-08-29T03:00:56.910 回答