[英]listbox isSelected databinding in DataTemplate
我嘗試在我的類中使用IsSelected
字段簡單地數據綁定IsSelected
屬性。 但是在我更改代碼中的值之后,它不會更改屬性,單擊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;
}
在此先感謝,對不起我的英語(仍在學習)。
@edit感謝您的快速回復。
出於測試目的,我創建了一個按鈕和文本塊:
<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
上選擇它,它不會在ListBox
本身中更改TextBlock
的數據。
@ edit2修復錯別字...
若要更改ListBoxItem
的IsSelected
屬性,需要更改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>
由於綁定模式是TwoWay
,因此選擇和取消選擇ListBoxItem
會動態更改項目的內容以顯示True
或False
。
還要注意我是如何將ListBox.ItemTemplate
更改為TextBlock
而不是ListBoxItem
。 ItemTemplate
定義ListBoxItem
的內容,因此通常使用某種類型的內容控件。 下面是不同布局的UI結構(可以使用WPF Tree Visualizer查看)。
ListBoxItem
作為ItemTemplate
:
TextBlock
作為ItemTemplate
:
編輯
另請注意,我刪除了IValueConverter
。 由於源屬性和目標屬性都是bool
,因此在這種情況下不需要轉換器。 嘗試刪除轉換器引用以查看是否可以解決問題。
不要綁定到ListBoxItem上的IsSelected。 ListBox有SelectedItem或SelectedItems屬性,你應該傳遞要被選擇的項目,即通過綁定。 在模型中設置IsSelected屬性並不是一個好主意。 最好在ViewModel中使SelectedItem通知屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.