gpt4 book ai didi

c# - listbox isSelected DataTemplate 中的数据绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 19:29:16 26 4
gpt4 key购买 nike

我尝试简单地将 IsSelected 属性与我类(class)中的 IsSelected 字段进行数据绑定(bind)。但是在我更改代码中的值后,它不会更改属性,单击 ListBoxItem 也不会更改字段值。

XAML:

<FlipView ItemsSource="{Binding Source={StaticResource itemsViewSource}}" ... >
<FlipView.ItemTemplate>
<DataTemplate>
<UserControl Loaded="StartLayoutUpdates"
Unloaded="StopLayoutUpdates">
<!-- other controls -->
<ListBox Grid.Row="1" Grid.ColumnSpan="3"
SelectionMode="Multiple" VerticalAlignment="Center"
ItemsSource="{Binding Answers}">
<ListBox.Resources>
<local:LogicToText x:Key="logToText" />
</ListBox.Resources>

<!-- bind IsSelected only in one way from
code to content -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<ListBoxItem
IsSelected="{Binding IsSelected, Mode=TwoWay, Converter={StaticResource logToText}}"
Content="{Binding IsSelected, Mode=TwoWay, Converter={StaticResource logToText}}">

</ListBoxItem>

</DataTemplate>
</ItemsControl.ItemTemplate>


<!-- not working at all
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}"/>
<Setter Property="Content"
Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</ListBox.Resources>-->

</ListBox>
</UserControl>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>

代码:

答案

private ObservableCollection<PrawoJazdyDataAnswer> _answers = 
new ObservableCollection<PrawoJazdyDataAnswer>();
public ObservableCollection<PrawoJazdyDataAnswer> Answers
{
get
{
return this._answers;
}
}

单项(答案)

public class PrawoJazdyDataAnswer : NPCHelper// PrawoJazdy.Common.BindableBase
{
public PrawoJazdyDataAnswer(String ans, bool ansb)
{
this._ans = ans;
this._isSelected = ansb;
}

public override string ToString()
{
return _isSelected.ToString(); //Only For debug purposes
//normally return _ans
}
private string _ans;
public string Ans
{
get { return this._ans; }
//set { this.SetProperty(ref this._ans, value); }
}

private bool _isSelected;
public bool IsSelected
{
get { return this._isSelected; }
set
{
_isSelected = value;
FirePropertyChanged("IsSelected");
//this.SetProperty(ref this._isSelected, value);
}
}
}

FirePropertyChanged

public class NPCHelper : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void FirePropertyChanged(string prop)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}

转换器(有时似乎需要而其他人不需要...,我尝试了来自不同教程/示例的 ~10 种方法)

public class LogicToText : IValueConverter
{
/// <summary>
///
/// </summary>
public object Convert(object value, Type targetType,
object parameter, string language)
{
//if (value == null || (bool)value == false)
// return "False";

return value.ToString();
}

/// <summary>
///
/// </summary>
public object ConvertBack(object value, Type targetType,
object parameter, string language)
{
return value.ToString().Contains("True") ? true : false;
}

提前致谢,对不起我的英语(还在学习)。

@编辑感谢您的快速回复。

出于测试目的,我创建了一个按钮和文本 block :

<Button Click="spr" >Sprawdź</Button>
<TextBlock Text="{Binding Answers[0].IsSelected, Mode=TwoWay}" > </TextBlock>

在其他控件部分(在列表框上方,但在FlipView中)点击方式

private void spr(object sender, RoutedEventArgs e)
{
var ans = ((PrawoJazdyDataQuestion)this.flipView.SelectedItem).Answers;
foreach (var item in ans)
item.IsSelected = item.IsSelected ? false : true;
}

正如我所写,当我从代码端更改数据时,它会更改元素的内容,但不会更改 ListBoxItem 的外观。如果我只是在 ListBox 上选择它,它不会更改 TextBlock 中的数据,也不会更改 ListBox 本身中的数据。

@edit2 修正拼写错误...

最佳答案

要更改 ListBoxItemIsSelected 属性,您需要更改 ListBox.ItemContainerStyle。看这里:

<ListBox Grid.Row="1" Grid.ColumnSpan="3"
SelectionMode="Multiple" VerticalAlignment="Center"
ItemsSource="{Binding Answers}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding IsSelected}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

由于绑定(bind)模式是 TwoWay,选择和取消选择 ListBoxItem 会动态更改项目的内容以显示 True错误

另请注意我如何将 ListBox.ItemTemplate 更改为 TextBlock 而不是 ListBoxItemItemTemplate 定义了 ListBoxItem 的内容,因此通常使用某种类型的内容控件。下面是不同布局的 UI 结构(可以使用 WPF 树可视化工具查看)。

ListBoxItem 作为 ItemTemplate:

enter image description here

TextBlock 作为 ItemTemplate:

enter image description here

编辑

另请注意,我删除了 IValueConverter。由于您的源属性和目标属性都是 bool,因此在这种情况下不需要转换器。尝试删除转换器引用以查看是否可以解决问题。

关于c# - listbox isSelected DataTemplate 中的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com