C# WPF数据绑定不更新属性(仅在启动时更新一次)

C# WPF数据绑定不更新属性(仅在启动时更新一次),c#,wpf,data-binding,C#,Wpf,Data Binding,我在绑定某些项目属性时遇到一些问题 我在itemscontrol中有组合框和按钮。组合框用于按名称搜索位置。这就是为什么在创建组合框时,属性IsEditable为true,以便用户输入名称,然后按left control通过WCF在数据库中搜索该字符串 然后,当combobox ItemSource.Count至少为1时,我通过设置IsEditable=false(使用按钮的数据绑定)来阻止combobox。此时按钮必须将可见性从隐藏更改为可见,因为按下按钮后,再次将可编辑设置为true,并允许

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

我在itemscontrol中有组合框和按钮。组合框用于按名称搜索位置。这就是为什么在创建组合框时,属性IsEditable为true,以便用户输入名称,然后按left control通过WCF在数据库中搜索该字符串

然后,当combobox ItemSource.Count至少为1时,我通过设置IsEditable=false(使用按钮的数据绑定)来阻止combobox。此时按钮必须将可见性从隐藏更改为可见,因为按下按钮后,再次将可编辑设置为true,并允许用户输入名称进行搜索

为了实现这一点,我将组合框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;
        }
    }
}
随着组合框项目的更改,这是否会影响按钮可见性的绑定? 绑定使用这个转换器,它也可以工作,但在我运行应用程序时只执行一次。这就是我遇到的问题,它只是不更新按钮的可见性,并使其处于隐藏状态:

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>

更改ItemSource时在cbx上调用.DataBind()是否有效

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


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

Hi,WPF控件中没有method.DataBind()。。或者至少没有出现..嘿,这有帮助!但当项目计数为零且按钮可见性必须设置为可见时,它不会执行代码。事实上,当itemsource更改时,它不是在执行代码吗?太好了!什么意思?编写转换器,使其可以随时执行,并处理转换器代码中的零计数-或者我误解了您?我的意思是,当ItemSource更改时,数据绑定不会执行转换器。我不知道为什么:/参见编辑2。您应该从一开始就将集合作为ItemsSource,而不必更改它。稍后,您只需为集合分配一个新值,而不必重新分配ItemsSource。您的变量“localities”超出范围@GarryVass你是什么意思?你有一个可观察的集合被声明为局部变量。绑定引擎无法看到它的getter,以便正确订阅可观察的事件@加里瓦斯,我现在改了。我直接分配服务返回的数组。但我还是有同样的问题,而且越来越糟了。使用getter和setter创建一个可观察的集合公共属性,并使您的项成为源。