【问题标题】:WPF Mvvm Radio Button Binding not setting initial value from viewmodelWPF Mvvm单选按钮绑定未从viewmodel设置初始值
【发布时间】:2011-08-17 16:47:08
【问题描述】:

我在使用单选按钮组时遇到了很多麻烦。最初,单选按钮不会从 ViewModel 设置值,而是在正确选择功能时设置。所以基本上用户不知道什么是初始值。

这是我的 xaml。

<ListBox ItemsSource="{Binding ViewModelCollection}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <RadioButton GroupName="rbList" IsChecked="{Binding Path=IsReady,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                            <Label Content="{Binding Path=NameOfRadioButton}"></Label>
                        </RadioButton>
                    </DataTemplate>
                </ListBox.ItemTemplate>    
            </ListBox>

这是我的视图模型

public bool IsReady
        {
            get
            {
                return BusinessObject.IsReady;  // debuggin on this line shows a true value being returned
            }
            set
            {
                BusinessObject.IsReady = value;
                OnPropertyChanged("IsReady");
            }
        }

Viewmodel 是一个简单的布尔值,它实现了 INotifyPropertyChanged。 我怀疑我可以使用枚举转换器,因为单选按钮的数量总是动态的。

所以为了澄清一下,在第一次运行时没有选择单选按钮,但在单击单选按钮后工作正常。视图模型和底层数据库反映了所做的更改。

如何让单选按钮在启动时显示值?

干杯。

【问题讨论】:

  • 您需要显示创建视图模型时的附加代码。根据您所说的猜测,我会说 bool 在启动时没有设置值,所以默认为 False。
  • 抱歉,它是从业务对象中获取的,调试显示了一个真正的值。我将更新代码以显示这一点。
  • 好的。截至目前,我已将单选按钮更改为复选框。这并没有真正给我想要的功能,但至少它在数据加载时显示了正确选择的项目。

标签: c# wpf data-binding mvvm radio-button


【解决方案1】:

我已经使用 ViewModel 的 ctor 中的测试对象将 ViewModelCollection 创建为 ObservableCollection,它对我有用,所以我认为你应该从那里的数据库中获取数据并从 ViewModelCollection 的 RaisePropertyChanged 中获取数据。

【讨论】:

    【解决方案2】:

    在使用 WPF 工具包主题 (http://wpf.codeplex.com/) 时遇到了同样的问题。我比较了 CheckBox(有效)和 RadioButton(无效)的控制模板。 IsChecked 值的触发器设置为与复选框相反,它查找“false”,然后在退出时执行检查动画,其中复选框查找 true。

    当单选按钮在呈现之前绑定时,这会导致问题,因为该值已经为 true,设置选中的视觉状态的动画不会触发,直到您选中另一个框以使其为 false。

    我修复了单选按钮主题,使其遵循与复选框相同的视觉状态逻辑。我不确定这是否会破坏单选按钮的任何其他功能,但到目前为止它似乎工作正常。

    【讨论】:

      【解决方案3】:

      我同意 user2174874 提供的答案。我想做的就是添加 xaml 代码,让事情变得简单。

      有问题的代码:

          <Trigger Property="IsChecked" Value="false">
      
              <Trigger.ExitActions>
                  <BeginStoryboard x:Name="CheckedOn_BeginStoryboard" Storyboard="{StaticResource CheckedOn}" />
              </Trigger.ExitActions>
              <Trigger.EnterActions>
                  <BeginStoryboard x:Name="CheckedOff_BeginStoryboard" Storyboard="{StaticResource CheckedOff}" />
              </Trigger.EnterActions>
      
          </Trigger>
          <Trigger Property="IsChecked" Value="True" />
      

      更正的代码:

          <Trigger Property="IsChecked" Value="True">
              <Trigger.ExitActions>
                  <BeginStoryboard x:Name="CheckedOff_BeginStoryboard" Storyboard="{StaticResource CheckedOff}" />
              </Trigger.ExitActions>
              <Trigger.EnterActions>
                  <BeginStoryboard x:Name="CheckedOn_BeginStoryboard" Storyboard="{StaticResource CheckedOn}" />
              </Trigger.EnterActions>
          </Trigger>
      

      【讨论】:

        猜你喜欢
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多