Xaml 使用依赖属性(UWP)从用户控件检索值

Xaml 使用依赖属性(UWP)从用户控件检索值,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,我有一个这样的自定义用户控件 <Grid> <ListView x:Name="LView" SelectedIndex="{Binding SelectedIndex}" ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}" VerticalAlignment="Stretch" SelectionMode

我有一个这样的自定义用户控件

     <Grid>
        <ListView x:Name="LView" SelectedIndex="{Binding SelectedIndex}" ItemsSource="{x:Bind 
ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}"  VerticalAlignment="Stretch"   SelectionMode="Multiple"  />
    </Grid>
        <local:CustomControl Grid.Column="0" Grid.Row="0"  Width="400"    Loaded="EditTextControl_Loaded"
                         x:Name="MultiCombo"     ></local:CustomControl>
在我的主页中,我像这样访问依赖属性

     <Grid>
        <ListView x:Name="LView" SelectedIndex="{Binding SelectedIndex}" ItemsSource="{x:Bind 
ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}"  VerticalAlignment="Stretch"   SelectionMode="Multiple"  />
    </Grid>
        <local:CustomControl Grid.Column="0" Grid.Row="0"  Width="400"    Loaded="EditTextControl_Loaded"
                         x:Name="MultiCombo"     ></local:CustomControl>
但是,在selectedIndexChange(主页面中)上既没有触发事件,也没有在主页面上获取任何值。我怎样才能做到这一点?
注意:我已上载完整的代码

我认为问题在于您没有正确绑定所选的
索引。
您不需要绑定到self/
列表视图的
SelectedIndex
,而是需要将其绑定到CustomControl的
SelectedIndex
DependencyProperty

<ListView ... SelectedIndex="{Binding
   Path=SelectedIndex,
   Mode=TwoWay,
   RelativeSource={RelativeSource
      Mode=FindAncestor,
      AncestorType={x:Type UserControl}}}" .../>


您可能需要根据需要将类型更改为CustomControl的类型(如果它不是
UserControl
)。

我认为问题在于您没有正确绑定
SelectedIndex
。 您不需要绑定到self/
列表视图的
SelectedIndex
,而是需要将其绑定到CustomControl的
SelectedIndex
DependencyProperty

<ListView ... SelectedIndex="{Binding
   Path=SelectedIndex,
   Mode=TwoWay,
   RelativeSource={RelativeSource
      Mode=FindAncestor,
      AncestorType={x:Type UserControl}}}" .../>


您可能需要根据需要将类型更改为CustomControl的类型(如果它不是
UserControl
)。

在CustomControl页面中,当您在ListView中选择其他项时,将ListView的SelectedIndex属性与SelectedIndex依赖项属性绑定的模式是单向的,SelectedIndex dependency属性不会更改,因此主页面中multicmbo.SelectedIndex的值不会更改。在这种情况下,需要将模式设置为双向

CustomControl.xaml:

<ListView x:Name="LView" SelectedIndex="{x:Bind SelectedIndex,Mode=TwoWay}" ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}"  VerticalAlignment="Stretch" SelectionMode="Multiple"  />
public int MPSelectedIndex
{
    get { return (int)GetValue(MPSelectedIndexProperty); }
    set { SetValue(MPSelectedIndexProperty, value); }
}
public static readonly DependencyProperty MPSelectedIndexProperty =
        DependencyProperty.Register("MPSelectedIndex", typeof(int), typeof(MainPage), new PropertyMetadata(0, new PropertyChangedCallback(OnDataChanged)));

private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MainPage currentPage = d as MainPage;
    int count = currentPage.MultiCombo.SelectedIndex;
}
<local:CustomControl Grid.Column="0" Grid.Row="0"  Width="400" Loaded="EditTextControl_Loaded" x:Name="MultiCombo"  SelectedIndex="{x:Bind MPSelectedIndex,Mode=TwoWay}" >
</local:CustomControl>
MainPage.xaml:

<ListView x:Name="LView" SelectedIndex="{x:Bind SelectedIndex,Mode=TwoWay}" ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}"  VerticalAlignment="Stretch" SelectionMode="Multiple"  />
public int MPSelectedIndex
{
    get { return (int)GetValue(MPSelectedIndexProperty); }
    set { SetValue(MPSelectedIndexProperty, value); }
}
public static readonly DependencyProperty MPSelectedIndexProperty =
        DependencyProperty.Register("MPSelectedIndex", typeof(int), typeof(MainPage), new PropertyMetadata(0, new PropertyChangedCallback(OnDataChanged)));

private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MainPage currentPage = d as MainPage;
    int count = currentPage.MultiCombo.SelectedIndex;
}
<local:CustomControl Grid.Column="0" Grid.Row="0"  Width="400" Loaded="EditTextControl_Loaded" x:Name="MultiCombo"  SelectedIndex="{x:Bind MPSelectedIndex,Mode=TwoWay}" >
</local:CustomControl>

注意:
由于您将ListView的
SelectionMode
设置为
Multiple
,因此当您选择第一项时,SelectedIndex为0,然后您还选择了第二项,SelectedIndex仍然为0。只有在取消选择第一项时,SelectedIndex才会更改并触发该方法。

在CustomControl页面中,将ListView的SelectedIndex属性与SelectedIndex dependency属性绑定的模式是单向的,在ListView中选择其他项时,SelectedIndex dependency属性不会更改,因此主页中multicmbo.SelectedIndex的值不会更改。在这种情况下,需要将模式设置为双向

CustomControl.xaml:

<ListView x:Name="LView" SelectedIndex="{x:Bind SelectedIndex,Mode=TwoWay}" ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}"  VerticalAlignment="Stretch" SelectionMode="Multiple"  />
public int MPSelectedIndex
{
    get { return (int)GetValue(MPSelectedIndexProperty); }
    set { SetValue(MPSelectedIndexProperty, value); }
}
public static readonly DependencyProperty MPSelectedIndexProperty =
        DependencyProperty.Register("MPSelectedIndex", typeof(int), typeof(MainPage), new PropertyMetadata(0, new PropertyChangedCallback(OnDataChanged)));

private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MainPage currentPage = d as MainPage;
    int count = currentPage.MultiCombo.SelectedIndex;
}
<local:CustomControl Grid.Column="0" Grid.Row="0"  Width="400" Loaded="EditTextControl_Loaded" x:Name="MultiCombo"  SelectedIndex="{x:Bind MPSelectedIndex,Mode=TwoWay}" >
</local:CustomControl>
MainPage.xaml:

<ListView x:Name="LView" SelectedIndex="{x:Bind SelectedIndex,Mode=TwoWay}" ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" Width="{x:Bind Width}" Height="{x:Bind Height}"  VerticalAlignment="Stretch" SelectionMode="Multiple"  />
public int MPSelectedIndex
{
    get { return (int)GetValue(MPSelectedIndexProperty); }
    set { SetValue(MPSelectedIndexProperty, value); }
}
public static readonly DependencyProperty MPSelectedIndexProperty =
        DependencyProperty.Register("MPSelectedIndex", typeof(int), typeof(MainPage), new PropertyMetadata(0, new PropertyChangedCallback(OnDataChanged)));

private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MainPage currentPage = d as MainPage;
    int count = currentPage.MultiCombo.SelectedIndex;
}
<local:CustomControl Grid.Column="0" Grid.Row="0"  Width="400" Loaded="EditTextControl_Loaded" x:Name="MultiCombo"  SelectedIndex="{x:Bind MPSelectedIndex,Mode=TwoWay}" >
</local:CustomControl>

注意: 由于您将ListView的
SelectionMode
设置为
Multiple
,因此当您选择第一项时,SelectedIndex为0,然后您还选择了第二项,SelectedIndex仍然为0。只有在取消选择第一项时,SelectedIndex才会更改并触发该方法