试图使用WinRT绑定到IsChecked

时间:2012-08-03 05:11:56

标签: binding radio-button windows-8 windows-runtime winrt-xaml

在下面的代码中,转换器中没有断点。单击单选按钮不会执行任何操作来更改活动控件。就像IsChecked甚至不会触发更改事件一样。有任何想法吗?这是WinRT代码。

<Page
    x:Class="TestBinding.MainPage"
    IsTabStop="false"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestBinding"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.Resources>
        <local:EqualsToBoolConverter x:Key="equalsToBoolConverter"/>
    </Page.Resources>
<Page.TopAppBar>
        <AppBar IsOpen="True" IsSticky="True">
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
                <RadioButton
                    Style="{StaticResource TextRadioButtonStyle}"
                    Name="goItem1"
                    IsChecked="{Binding ElementName=flipView,Path=SelectedItem,Converter={StaticResource equalsToBoolConverter}, ConverterParameter={Binding ElementName=item1}, Mode=TwoWay}">Go 1</RadioButton>
                <RadioButton
                    Style="{StaticResource TextRadioButtonStyle}"
                    Name="goItem2"
                    IsChecked="{Binding ElementName=flipView,Path=SelectedItem,Converter={StaticResource equalsToBoolConverter}, ConverterParameter={Binding ElementName=item2}, Mode=TwoWay}">Go 2</RadioButton>
            </StackPanel>
        </AppBar>
    </Page.TopAppBar>
    <FlipView
        Name="flipView"
        Background="{StaticResource ApplicationPageBackgroundThemeBrush}"
        Margin="100"
        Padding="10"
        SelectedIndex="0">
        <FlipViewItem Name="item1">
            <TextBlock Text="item1"/>
        </FlipViewItem>
        <FlipViewItem Name="item2">
            <TextBlock Text="item2"/>
        </FlipViewItem>
    </FlipView>
</Page>

4 个答案:

答案 0 :(得分:1)

我无法在RadioButton.IsChecked中声明任何绑定。但是,我确实通过反转问题让这个工作得很好。 FlipViewItem上有一个IsSelected属性。我成功地采用了这种方法:

IsSelected="{Binding ElementName=radioButton1,Path=IsChecked,Mode=TwoWay}"

答案 1 :(得分:0)

不确定转换器的作用,但IsChecked的常见问题是它不是bool,而是bool?Nullable<bool>)。那是你的转换器需要/返回的吗?

答案 2 :(得分:0)

嗯,这不是布尔?你需要的。看(这很好):

<Grid Height="150">
    <Grid.Resources>
        <x:Boolean x:Key="MyBool">true</x:Boolean>
    </Grid.Resources>
    <StackPanel>
        <CheckBox IsChecked="true" Content="Hello World" />
        <CheckBox IsChecked="{StaticResource MyBool}" Content="Hello World" />
    </StackPanel>
</Grid>

您的问题是转换器参数不能是绑定值。

答案 3 :(得分:0)

This MSDN Blog描述了一种可以使用ConverterParameters绑定的技术。

主要摘录:

  

ConverterParameter不是依赖属性,而是“简单”对象。在这种情况下,您不能使用绑定。所有XAML平台都有这种副作用:WP7-8,Silverlight,WPF,当然还有WinRT。

     

我的想法是在我的转换器上创建依赖项属性而不使用ConverterParameter:为了能够创建DP,您的转换器必须从DependencyObject继承:

public class DistanceConverter : DependencyObject, IValueConverter
{
    public UserViewModel CurrentUser
    {
        get { return (UserViewModel) GetValue(CurrentUserProperty); }
        set { SetValue(CurrentUserProperty, value); }
    }

    public static readonly DependencyProperty CurrentUserProperty =
        DependencyProperty.Register("CurrentUser",
                                    typeof (UserViewModel),
                                    typeof (DistanceConverter),
                                    new PropertyMetadata(null));

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
  

然后,我在我的页面资源中声明了我的转换器:

<common:LayoutAwarePage.Resources>
  <conv:DistanceConverter x:Key="DistanceConverter"  
    CurrentUser="{Binding User}"
    CurrentItem="{Binding CurrentItem}"
    MaxWidthAvailable="450" />
</common:LayoutAwarePage.Resources>
  

最后,我在我的项目模板中设置了转换器:

<Rectangle HorizontalAlignment="Left" VerticalAlignment="Center" 
           Fill="#00FF84" Margin="10,0" Height="10"
           Width="{Binding Path=CurrentItem.Distance, 
 Converter={StaticResource DistanceConverter}}">
</Rectangle>