根据多个条件绑定单选按钮和文本框

时间:2012-06-15 11:49:23

标签: wpf binding

我是WPF和MVVM的新手,我正在寻找正确方向的指针。

我想在Microsoft Word中实现类似于“打印n页,当前页面或选择”的内容。

Microsoft Word Print n pages

在我的示例中,我有无线电按钮可在 radio1 radio2 之间切换,但

  1. 默认为视图模型中的TimeType
    1. TimeType == Type1 =>选择了radio1,text1 =“”
    2. TimeType == Type2 =>选择了radio2,text1 = ViewModel.Time
  2. 如果用户选择 radio1 ,我想清除 text1
  3. 如果 text1 中的输入值,我希望单选按钮切换到 radio2 ,视图模型会相应更新< / LI>

    我已经看过并尝试了各种转换器的例子,但是我无法弄清楚如何在行为中获得各种影响以便很好地协同工作。

    我有一种感觉,我应该在视图模型中实现一些东西来做逻辑,但我看不到要绑定的内容。

    XAML

    <Grid.Resources>
        <local:EnumToBooleanConverter x:Key="e2b" />
    </Grid.Resources>
    <RadioButton Name="radio1" GroupName="g1" Content="Radio 1"
        IsChecked="{Binding Path=TimeType, Converter={StaticResource e2b}, ConverterParameter={x:Static vm:TimeType.Type1}}"
        />
    <RadioButton Name="radio2" GroupName="g1">
        <TextBox Name="text1"
            Text="{Binding Path=ExplicitTime, Mode=TwoWay}">
        </TextBox>
    </RadioButton>
    

    查看模型

    // UPDATE: added INotifyPropertyChanged as per my actual code
    class MagicTimeViewModel :INotifyPropertyChanged {
        public enum TimeType{Type1, Type2}
        TimeType _type; int _time;
        public TimeType TimeType{
            get{_return _type;}
            set {_type = value; Notify("TimeType");}
        }
        public int Time {
            get{_return _time;}
            set {_time = value; Notify("Time");}
        }
        void Notify(string name)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
    

2 个答案:

答案 0 :(得分:0)

您需要在INotifyPropertyChanged

中实施ViewModel

答案 1 :(得分:0)

通常做这样的事情我使用ListBox(因为你想跟踪一个选定的项目,一次只能选择一个项目),并覆盖样式显示为{{1} }

RadioButtons

<Style x:Key="RadioButtonListBoxStyle" TargetType="{x:Type ListBox}"> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" /> <Setter Property="ItemContainerStyle"> <Setter.Value> <Style TargetType="{x:Type ListBoxItem}" > <Setter Property="Margin" Value="2, 2, 2, 0" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Border Background="Transparent"> <RadioButton IsHitTestVisible="False" Focusable="false" Content="{TemplateBinding ContentPresenter.Content}" IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> </Style> 存储ViewModelSelectedIndex属性,当一个属性发生更改时,它还会更新任何相关属性。

例如,当TimeText更改为0时,请清除SelectedIndexTimeText更改后,请将TimeText设置为1

以下是XAML的一个示例:

SelectedIndex