[英]WPF ListBox custom item
我想在列表框內有一個“自定義”項,以便用戶可以輸入除預設可選值之外的自定義值。
這是我的XAML代碼:
<ListBox SelectedValue="{Binding SomeValue}"
SelectedValuePath="Tag"
Style="{StaticResource HorizontalRadioButtonList}">
<!-- style from http://stackoverflow.com/a/4120034/1813487 -->
<ListBoxItem Tag="10"
Content="10"/>
<ListBoxItem Tag="20"
Content="20"/>
<ListBoxItem Tag="30"
Content="30"/>
<ListBoxItem x:Name="CustomListBoxItem">
<TextBox Text="{Binding ElementName=CustomListBoxItem,
Mode=OneWayToSource,
UpdateSourceTrigger=PropertyChanged,
Path=Tag}"/>
</ListBoxItem>
</ListBox>
<TextBlock Text="{Binding SomeValue}"/>
用戶在TextBox中輸入內容后,如何使SomeValue更新? 當前,ListBox不會檢測到Tag更改,並且不會更新SomeValue。
我認為您可以通過使用附加到TextBox的行為來實現此目的,在該行為上對TextChanged事件進行簽名,並在每次觸發該事件時,都可以將ListBoxItem的標記設置為TextBox的文本。
我做了類似的事情,但是使用了Microsoft.Expression.Interactivity:
<ListBoxItem x:Name="UniqueValue" Tag="40">
<TextBox x:Name="TextBox" Text="40">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<ei:ChangePropertyAction PropertyName="Tag"
TargetObject="{Binding ElementName=UniqueValue}"
Value="{Binding Text,
ElementName=TextBox}" />
<ei:ChangePropertyAction PropertyName="SomeValue"
TargetObject="{Binding}"
Value="{Binding Text,
ElementName=TextBox,
Converter={StaticResource StringToIntConverter}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</ListBoxItem>
基本上,每次更改文本時,屬性Tag的值都將設置為書面文本,然后(為了保持對ListBoxItem的選擇),視圖模型的屬性SomeValue的值將設置為相同的文本。
命名空間:
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
需要組裝:
System.Windows.Interactivity
Microsoft.Expression.Interactions
這是我的操作方式,也不是完美的解決方案:
XAML:
<ListBox SelectedValue="{Binding SomeValue}"
SelectedValuePath="Tag"
Style="{StaticResource HorizontalRadioButtonList}"
x:Name="CustomListBox">
<!-- ...items... -->
<ListBoxItem x:Name="CustomListBoxItem">
<TextBox Text="{Binding ElementName=CustomListBoxItem,
Mode=OneWayToSource,
UpdateSourceTrigger=PropertyChanged,
Path=Tag}"
TextChanged="UpdateCustomValue"
x:Name="CustomTextBox"/>
</ListBoxItem>
</ListBox>
<TextBlock Text="{Binding SomeValue}"/>
碼:
private void UpdateUniqueValue(object sender, TextChangedEventArgs e)
{
var listBox = sender == CustomTextBox? CustomListBox: null;
if (listBox != null)
{
var textBox = (TextBox) sender;
try // so that invalid values are not allowed
{
listBox.SelectedValue = textBox.Text;
}
catch
{
textBox.Text = listBox.SelectedValue.ToString();
}
}
}
這是一種解決方法,也沒有考慮驗證器,但至少不允許輸入無效值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.