【问题标题】:How to bind to radiobutton selected property in XAML如何绑定到 XAML 中的单选按钮选定属性
【发布时间】:2016-01-08 17:13:18
【问题描述】:

使用 Visual Studio 2015 社区和 .NET 4.5

我有一个特定于我的应用用户的单选按钮的动态列表。当用户使用 Web 服务进行身份验证时,会动态创建按钮列表。列表存储在 ObservableCollection 中。我已将它绑定到 XAML 并正确呈现,并且在选择后正确存储 isSelected。

我想要做的是在用户选择服务类型(单击单选按钮)时触发事件。我已经阅读了很多示例,但它们对单选按钮进行了硬编码,但就我而言,我需要这些按钮是动态的。

如何将 XAML 中的按钮单击绑定到 ViewModel?

ServiceCost.cs

public class ServiceCost
{
    public long pst_id { get; set; }
    public string pst_description_short { get; set; }
    public decimal pst_cost { get; set; }
    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set{if (value != _isSelected) { _isSelected = value; } }
    }
    public string DescriptionPrice
    {
        get
        {
            return string.Format(Strings.ServiceCost_DescriptionPrice, this.pst_description_short, pst_cost.ToString());
        } 
    }
 ...

xaml:

  ...
  <GroupBox
      Grid.Row="1"
      Grid.ColumnSpan="2"
      Grid.Column="2"
      FontWeight="Bold"
      Header="Select Service Type"
      Margin="0,7,0,0"
      Padding="2">
        <ItemsControl FontWeight="Normal" ItemsSource="{Binding Path=ServiceTypes}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <RadioButton
                          Content="{Binding Path=DescriptionPrice}"
                          IsChecked="{Binding Path=IsSelected}"
                          GroupName="ServiceType"
                          Margin="2,3.5"
                          />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </GroupBox>
    ...

视图模型:

    ...
    private ObservableCollection<ServiceCost> _serviceTypes;
    public ObservableCollection<ServiceCost> ServiceTypes
    {
        get { return _serviceTypes; }
        set
        {
            if (_serviceTypes != value)
            {
                _serviceTypes = value;
                DynamicOnPropertyChanged();
            }
        }
    }
    ...

【问题讨论】:

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


    【解决方案1】:

    如果我正确理解您的问题,您只想在 XAML 中执行此操作。如果是这样,使用EventTrigger 是可行的方法。

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <RadioButton Margin="2,3.5"
                         Content="{Binding Path=DescriptionPrice}"
                         GroupName="ServiceType"
                         IsChecked="{Binding Path=IsSelected}">
                <RadioButton.Triggers>
                    <EventTrigger RoutedEvent="ToggleButton.Checked">
                    </EventTrigger>
                </RadioButton.Triggers>
            </RadioButton>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    

    请注意,RadioButton 的Checked 事件可通过其基类ToggleButton 访问。如果你需要在这个事件上调用代码,你可以试试this technique

    【讨论】:

    • 感谢您的帮助,但如果没有更多工作要做,我无法让事件触发器在我的代码中工作,至少我无法让它们绑定到视图模型,工作serviceCost 类,但这没有帮助。示例enc。当我尝试安装这些外部引用时,做了一些事情来破坏我的项目,但我无法理解它在哪里破坏......
    • 也许这可能更有用:codeproject.com/Articles/42134/…
    【解决方案2】:

    我遇到的问题是单击单选按钮后访问视图模型。经过大量搜索,我发现 ListBox 是一种包装单选按钮的方式,它具有一个 selectedItem,然后我可以将 listbox 的 selectedItem 绑定到我的 ViewModel 并访问该变量。我不知道这是否是让它工作的最佳方式,但它确实对我有用。

    ServiceCost.cs = 不变。

    xaml:

    ...
        <GroupBox
          Grid.Row="1"
          Grid.ColumnSpan="2"
          Grid.Column="2"
          FontWeight="Bold"
          Header="Select Service Type"
          Margin="0,7,0,0"
          Padding="2" >
            <ListBox  Margin="0,10,0,10" BorderThickness="0" Background="Transparent"
                ItemsSource="{Binding ServiceCosts}"
                SelectedItem="{Binding SelectedServiceCost}" >
                <ListBox.ItemContainerStyle>
                    <Style TargetType="{x:Type ListBoxItem}">
                        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ListBoxItem">
                                    <ContentPresenter/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.ItemContainerStyle>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <RadioButton Content="{Binding DescriptionPrice}"
                           IsChecked="{Binding Path=IsSelected, Mode=TwoWay,  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Margin="0,5,0,5"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </GroupBox>
        ...
    

    视图模型:

        ...
        private ObservableCollection<ServiceCost> _serviceCosts;
        public ObservableCollection<ServiceCost> ServiceCosts
        {
            get { return _serviceCosts; }
            set { if (_serviceCosts != value){_serviceCosts = value;    DynamicOnPropertyChanged();}}
        }
    
        private ServiceCost _selectedServiceCost;
        public ServiceCost SelectedServiceCost
        {
            get { return _selectedServiceCost; }
            set
            { 
                if (_selectedServiceCost != value)
                {
                    // This is what I needed access to:  do something here!.
                    _selectedServiceCost = value;
                    DynamicOnPropertyChanged(); 
                }
            }
        }
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 2017-06-22
      • 2012-12-27
      • 2014-10-14
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多