0

短くするために、コンボボックスとテキストボックス、および別のコンボボックスを備えたデータグリッドがあるとします。最初のコンボで選択した値に応じて、テキストまたはコンボボックスを表示または非表示にしたい

               <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

私が収集できるものから、すべてを制御する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」のプロパティにマップされるようになったことです。これの例外は、メインVMにバインドする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       

}

ここで、このアイテムに対して選択された値が変更されると、テキストを表示するかどうかを決定するためにいくつかのロジックが実行されることがわかります。

これにはいくつか問題がありますが、うまくいけば正しい道に進むことができます。

于 2012-08-29T03:00:56.910 に答える