1

チェックボックスを含むいくつかのテンプレート化された列を持つ WPF DataGrid があります。特定のチェックボックスを押すと、別のチェックボックスのソースを設定する必要があります。

私はプロパティと呼ばれるプロパティを持つViewmodelを持っています(はい、私は知っています:))、そしてこのプロパティにはプロパティ「Visible」があります。「必須」チェックボックスをオンにすると、「可視」値が設定され、可視チェックボックスも設定されますが、どういうわけかこれは機能しません。

私のコードは次のとおりです。

   <toolkit:DataGridTemplateColumn Header="Mandatory" IsReadOnly="False">
        <toolkit:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <CheckBox IsChecked="{Binding Path=Mandatory,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                        <CheckBox.Style>
                            <Style TargetType="{x:Type CheckBox}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=MandatoryDB}" Value="True">
                                        <Setter Property="IsEnabled" Value="False" />
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Path=MandatoryDB}" Value="False">
                                        <Setter Property="IsEnabled" Value="True" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </CheckBox.Style>
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Checked">
                                <ei:ChangePropertyAction TargetObject="{Binding UpdateSourceTrigger=PropertyChanged}" PropertyName="ReadOnly" Value="False" />
                                <ei:ChangePropertyAction TargetObject="{Binding NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" PropertyName="Visible" Value="True" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </CheckBox>
                </StackPanel>
            </DataTemplate>
        </toolkit:DataGridTemplateColumn.CellTemplate>
    </toolkit:DataGridTemplateColumn>

ありがとう、ジョニー

4

2 に答える 2

0

これが役立つかどうかを確認してください。

Datagrid に yes、no、および ans を表示するとします。これについては、以下のサンプル コードを見つけてください。

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Coll}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Yes">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Width="50"
                              Height="50"
                              IsChecked="{Binding Yes,
                                                  Mode=TwoWay,
                                                  UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="No">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Width="50"
                              Height="50"
                              IsChecked="{Binding No,
                                                  Mode=TwoWay,
                                                  UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Ans">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Rectangle Width="100"
                               Height="50"
                               RadiusX="25"
                               RadiusY="25">
                        <Rectangle.Style>
                            <Style TargetType="{x:Type Rectangle}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Ans}" Value="true">
                                        <Setter Property="Fill" Value="Green" />
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Ans}" Value="false">
                                        <Setter Property="Fill" Value="Red" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Rectangle.Style>

                    </Rectangle>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

コードビハインド

  public partial class YesNoTest : Window
    {
        public YesNoTest()
        {
            InitializeComponent();
            if (Coll == null)
            {
                Coll = new ObservableCollection<Anss>();
                for (int index = 0; index < 10; index++)
                {
                    Coll.Add(new Anss() { Yes = false, No = false, Ans = true });
                }
            }


            this.DataContext = this;
        }

        private ObservableCollection<Anss> _coll;

        public ObservableCollection<Anss> Coll
        {
            get { return _coll; }
            set { _coll = value; }
        }

    }


    public class Anss : INotifyPropertyChanged
    {
        private bool _Yes;

        public bool Yes
        {
            get
            {
                return _Yes;
            }
            set { _Yes = value; OnChanged("Yes"); OnChanged("Ans"); }
        }


        private bool _No;

        public bool No
        {
            get
            {
                if (_No == true)
                    Yes = false;
                return _No;
            }
            set { _No = value; OnChanged("No"); OnChanged("Ans"); }
        }

        private bool _Ans;

        public bool Ans
        {
            get
            {
                if (Yes == true)
                    _Ans = true;
                else
                    _Ans = false;
                return _Ans;
            }
            set { _Ans = value; OnChanged("Ans"); }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        public void OnChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
于 2012-05-22T09:01:12.803 に答える
0

あなたがやろうとしているのは、恐ろしいアンチパターンである View によってビジネスロジックを駆動することだと思います。「必須」チェックボックスの値が変更された場合、ビューモデルはそれに応じて他のプロパティを設定し、変更があったことをビューに警告する必要があります ( INotifyPropertyChanged)。

ビューはビューモデルのプロパティを設定してはいけません。それらを読み取ってユーザー入力を渡すだけで、ビューが制御する必要がある他のものは、コンバーターとその他のビューのみのアイテムだけです。

お役に立てれば

于 2012-05-22T08:03:34.470 に答える