在DataTemplate UWP

我试图绑定ComboBoxItem的属性IsSelected以便显示正确的图标,如果选择了该项目,则应显示红色图标,否则为打开的列表的其余部分显示灰色。下面的代码显示了我如何实现该功能的方式。

<ComboBox
    ItemsSource="{Binding Icons}"
    SelectedItem="{Binding SelectedIcon,Mode=TwoWay}"
    Style="{ThemeResource DefaultComboBoxStyle}"
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                    <Image
                        Width="20"
                        Height="20"
                        Source="{Binding IconId,Mode=TwoWay,Converter={StaticResource IconConverter},ConverterParameter={StaticResource True}}"
                        Visibility="{Binding Path=IsSelected,RelativeSource={RelativeSource Mode=TemplatedParent},Converter={StaticResource BoolToVisibilityConverter}}" />
                    <Image
                        Width="20"
                        Height="20"
                        Source="{Binding IconId,Converter={StaticResource IconConverter}}"
                        Visibility="{{Binding Path=IsSelected,RelativeSource={RelativeSource Mode=TemplatedParent} Converter={StaticResource BoolToVisibilityInverted}}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

两个图像转换器的项目图标ID相同,这取决于传递的参数,将返回正确的图像链接。我尝试获取父数​​据上下文,并尝试使用comboBoxItem(SelectorItem)的IsSelected属性,但是它不起作用。

我不想在ViewModel中添加IsSlected属性以进行迭代,我假设存在某些语法,但是找不到它。我只想获取属性IsSelected的值并绑定到xaml中,而无需在ViewModel中更改代码。

虽然可以实现以下代码中的某些内容,但是可以使用硬编码元素。根据ComboBoxItem的IsSelected item属性显示正确的图标。我希望使用ItemsSource和DataTemplate具有相同的功能。

 <ComboBox
    SelectedIndex="{Binding IconType,Converter={StaticResource IconTypeIndexToIconConverter}}"
    Style="{ThemeResource DefaultComboBoxStyle}">
    <ComboBoxItem x:Name="SwitchIcon">
        <StackPanel Orientation="Horizontal">
                <Image
                    Source="{Binding Source=1,Converter={StaticResource IconConverter}}"
                    Style="{ThemeResource DeviceTypeImageBlockStyle}"
                    Visibility="{Binding IsSelected,ElementName=SwitchIcon,Converter={StaticResource BoolToVisibilityInverted}}" />
                <Image
                    Source="{Binding Source=1,ConverterParameter={StaticResource True}}"
                    Style="{ThemeResource DeviceTypeImageBlockStyle}"
                    Visibility="{Binding IsSelected,Converter={StaticResource BoolToVisibilityConverter}}" />
        </StackPanel>
    </ComboBoxItem>
    <ComboBoxItem x:Name="LightDimmingIcon">
        <StackPanel Orientation="Horizontal">
                <Image
                    Source="{Binding Source=2,ElementName=LightDimmingIcon,Converter={StaticResource BoolToVisibilityInverted}}" />
                <Image
                    Source="{Binding Source=2,Converter={StaticResource BoolToVisibilityConverter}}" />
        </StackPanel>
    </ComboBoxItem>
</ComboBox>

有什么想法吗?解决方案?

iCMS 回答:在DataTemplate UWP

在DataTemplate UWP中绑定ComboBoxItem的IsSelected属性

恐怕您无法在IsSelected UWP中绑定ComboBoxItem的{​​{1}}属性。因为TemplatedParent RelativeSource是DataTemplate而不是ContentPresenter,所以您可以使用xaml命令进行验证。

ComboBoxItem

它将在<ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Border DataContext="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"> <TextBlock x:Name="Print" Text="{Binding}"/> </Border> <TextBlock Text="{Binding}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> 文本框中显示Windows.UI.Controls.ContentPresenter

我不想在ViewModel中添加IsSlected属性进行迭代,我假设存在某些语法,但是找不到。

通常,我们通过在模型类中添加Print来处理场景。并获得选择项,修改IsSlected值以影响UI。我在下面做了完整的示例。

隐藏代码

IsSlected

Xaml

public sealed partial class MainPage : Page,INotifyPropertyChanged
{
    public List<CBContent> Items { get; set; } = new List<CBContent>();
    public MainPage()
    {
        this.InitializeComponent();
        Items.Add(new CBContent { Content = "Item1",IsSelected = false });
        Items.Add(new CBContent { Content = "Item2",IsSelected = false });
        Items.Add(new CBContent { Content = "Item3",IsSelected = false });
        Items.Add(new CBContent { Content = "Item4",IsSelected = false });
        Items.Add(new CBContent { Content = "Item5",IsSelected = false });
        Items.Add(new CBContent { Content = "Item6",IsSelected = false });
        this.DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
    }
    private CBContent _selectItem;

    private CBContent _previousSelectItem;
    public CBContent SelectItem
    {
        get
        {
            return _selectItem;
        }
        set
        {
            _selectItem = value;              
            value.IsSelected = true;
            if(_previousSelectItem != null)
            {
                _previousSelectItem.IsSelected = false;
            }
            _previousSelectItem = _selectItem;
            OnPropertyChanged();               
        }
    }
}
public class CBContent : INotifyPropertyChanged
{
    public string Content { get; set; }
    private bool _isSelect;
    public bool IsSelected
    {
        get
        {
            return _isSelect;
        }
        set
        {
            _isSelect = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
    }
}
本文链接:https://www.f2er.com/1929211.html

大家都在问