WPF DataBinding不更新属性(启动时只有一次)

时间:2013-11-24 19:35:31

标签: c# wpf data-binding

我在绑定某些项属性时遇到了一些问题。

我在项目控件中有组合框和按钮。组合框用于按名称搜索地区。这就是为什么在创建组合框时,属性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;
    }
}

这是控件的图像,它可能会帮助你得到我说的话:

enter image description here

以防万一,这是我使用的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>

1 个答案:

答案 0 :(得分:1)

更改ItemSource时是否可以在cbx上调用.DataBind()?

编辑:我将绑定路径Items.Count的可见性,而不仅仅是Items,并使转换器处理整数而不是Item-list。因为Count-property触发PropertyChanged事件,如果添加/删除元素,则列表本身不会。

编辑2:将您的项目的ObservableCollection声明为方法本身之外的公共属性,因此它将具有公共范围。并将其设置为ItemsSource。然后你不必改变ItemSource属性,只改变集合本身。