我在绑定某些项属性时遇到了一些问题。
我在项目控件中有组合框和按钮。组合框用于按名称搜索地区。这就是为什么在创建组合框时,属性IsEditable为true,以便让用户输入名称,然后按左控制通过WCF在数据库中搜索该字符串。
然后,当组合框ItemSource.Count至少为1时,我通过设置IsEditable = false(使用按钮的DataBinding)来阻止组合框。多数按钮必须将可见性从隐藏更改为可见,因为再次按下按钮将IsEditable设置为true,并使用户输入要搜索的名称。
为了达到这个目的,我已经使用按钮Visibility属性绑定了组合框IsEditable,并使用了以下转换器,它可以工作:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
public class VisibilityToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (Visibility)value == Visibility.Visible ? false : true;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
正如我所说,左控制按钮搜索地区,因为我正在使用keydown事件:
private void ComboBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftCtrl)
{
ComboBox cbx = sender as ComboBox;
LocationServiceClient locationService = new LocationServiceClient();
if (cbx != null)
{
cbx.ItemsSource = locationService.SeachLocalities(new SearchLocalitiesRequest { Search = cbx.Text, MaxItems = 20 }).Localities;
cbx.DisplayMemberPath = "LocalityName";
localityCombobox = cbx;
cbx.IsDropDownOpen = true;
}
}
}
随着Combobox的项目发生变化,不会影响Button可见性的绑定吗? 绑定使用此转换器,它也可以工作,但只运行一次,当我运行应用程序时。这就是我遇到的问题,它只是不更新按钮可见性,并将其保留为隐藏:
public class ItemsSourceCountToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var b = (int)value > 0 ? Visibility.Visible : Visibility.Hidden;
return b;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
这是控件的图像,它可能会帮助你得到我说的话:
以防万一,这是我使用的xaml:
<ComboBox Name ="cbxLocality" Width="200" DisplayMemberPath="{Binding LocalityName}" IsEditable="{Binding ElementName= btnRemoveLocality, Path=Visibility, Converter={StaticResource VisibilityToBooleanConverter}}" KeyDown="ComboBox_KeyDown">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding LocalityName}"/>
<TextBlock FontSize="10">
<Run Text="CP: "/>
<Run Text="{Binding ZipCode}"/>
<Run Text=" | "/>
<Run Text="{Binding Province.ProvinceName}"/>
</TextBlock>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Name ="btnRemoveLocality" Content="x" Visibility="{Binding ElementName= cbxLocality, Path=Items.Count, Converter={StaticResource ItemsSourceCountToVisibilityConverter}}" Click="Button_Click_3"></Button>
答案 0 :(得分:1)
更改ItemSource时是否可以在cbx上调用.DataBind()?
编辑:我将绑定路径Items.Count的可见性,而不仅仅是Items,并使转换器处理整数而不是Item-list。因为Count-property触发PropertyChanged事件,如果添加/删除元素,则列表本身不会。
编辑2:将您的项目的ObservableCollection声明为方法本身之外的公共属性,因此它将具有公共范围。并将其设置为ItemsSource。然后你不必改变ItemSource属性,只改变集合本身。