WPF Mvvm单选按钮绑定不从viewmodel设置初始值

时间:2011-05-03 12:47:13

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

我在使用单选按钮组时遇到了一些麻烦。最初,单选按钮不会从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>

这是我的ViewModel

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

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

所以只是为了澄清,在第一次运行时没有选择单选按钮,但点击后无线电按钮工作正常。 viewmodel和底层数据库反映了所做的更改。

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

欢呼声。

3 个答案:

答案 0 :(得分:2)

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

当单选按钮在渲染之前被绑定时,这会导致问题,因为该值已经为真,设置检查的可视状态的动画在您选中另一个框以使其为假之前不会触发。

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

答案 1 :(得分:1)

我同意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>

答案 2 :(得分:0)

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