如何在ControlTemplate中绑定RadioButton

时间:2017-06-12 06:35:23

标签: wpf data-binding listbox controltemplate

我正在使用带有controlTemplate的ListBox来显示带有ListBoxItem的RadioButton。 在这里,我想将RadioButton的IsChecked属性设置为true,并为此进行必要的wpf绑定。下面是xaml

<ListBox ItemsSource="{Binding Products}" DisplayMemberPath="ProductName" Grid.Column="0" Width="250" HorizontalAlignment="Left" Margin="0,2,0,30" AlternationCount="2">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Margin" Value="2"/>
            <Setter Property="Template">                                       
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <RadioButton IsChecked="{Binding IsRadioButtonChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
                            <ContentPresenter></ContentPresenter>
                        </RadioButton>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
                <!--Alternate Style Indexing-->
                <Style.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter Property="Background" Value="LightGray"></Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>

此类背后的代码是

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ListStylesViewModel();
    }
}

ListStyleViewModel类是

public class ListStylesViewModel : INotifyPropertyChanged
{
    private string prodName;
    private List<Products> products;
    private bool isChecked = true;

    public ListStylesViewModel()
    {
        ListStyleModel model = new ListStyleModel();
        this.Products = model.GetProducts();
    }

    public string ProductName
    {
        get
        {
            return this.prodName;
        }
        set
        {
            this.prodName = value;
            this.OnPropertyChanged("ProductName");
        }
    }

    public List<Products> Products
    {
        get
        {
            return this.products;
        }
        set
        {
            this.products = value;
            this.OnPropertyChanged("Products");
        }
    }

    public bool IsRadioButtonChecked
    {
        get
        {
            return this.isChecked;
        }
        set
        {
            this.isChecked = value;
            this.OnPropertyChanged("IsChecked");
        }
    }

    #region
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string pptName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(pptName));
        }
    }
    #endregion

请告诉我这里做错了什么?

1 个答案:

答案 0 :(得分:0)

绑定表达式

IsChecked="{Binding IsRadioButtonChecked,
                    RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
ControlTemplate中的

使用ListBoxItem作为源对象。但是,ListBoxItem没有IsRadioButtonChecked属性。

由于绑定源属性位于ListBox的DataContext中的ListStylesViewModel实例中,因此绑定表达式应如下所示:

IsChecked="{Binding DataContext.IsRadioButtonChecked,
                    RelativeSource={RelativeSource AncestorType=ListBox}}"