【问题标题】:WPF Change ViewModel Property in ViewWPF 在视图中更改 ViewModel 属性
【发布时间】:2012-05-28 16:48:33
【问题描述】:

我有一个 WPF DataGrid,其中包含多个包含复选框的模板列。 如果我按下一个特定的复选框,则必须设置另一个复选框的来源。

我有一个带有名为 Property 的属性的 Viewmodel(是的,我知道 :)),并且该属性具有“可见”属性。 如果我选中“强制”复选框,我希望设置“可见”值,因此也设置可见复选框,但不知何故这不起作用。

这是我的代码:

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

谢谢, 强尼

【问题讨论】:

    标签: wpf mvvm viewmodel


    【解决方案1】:

    我认为您要做的是通过您的视图来驱动您的业务逻辑,这是一种可怕的反模式。您需要做的是,当“强制”复选框的值发生更改时,您的视图模型需要相应地设置其他属性并提醒您的视图发生了更改 (INotifyPropertyChanged)。

    您的视图不应设置任何视图模型属性,它应该只读取它们并传递用户输入,您的视图需要控制的唯一其他东西是转换器和其他仅视图项。

    希望对你有帮助

    【讨论】:

    • 嘿,你是完全正确的:这是解决这个问题的坏方法。我坚持将其作为命令发送到 Viewmodel 并更改 ViewModel 上的值,但无论如何我的命令不会触发。在 datagridtemplatecolumn 中调用命令有什么不同吗?
    • 嗯,明白了,Relative Source 是我的朋友 ;) 感谢您的回答!
    【解决方案2】:

    看看这对你有没有帮助。

    假设您想在 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));
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多