c# - WPF DataBinding 不更新属性(仅在启动时更新一次)

标签 c# wpf data-binding

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

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

然后,当组合框 ItemSource.Count 至少为 1 时,我通过设置 IsEditable = false(使用按钮的 DataBinding)来阻止组合框。那时按钮必须将可见性从隐藏更改为可见,因为再次按下按钮将 IsEditable 设置为 true,并允许用户输入要搜索的名称。

为此,我将组合框 IsEditable 与按钮 Visibility 属性绑定(bind),并使用了以下有效的转换器:

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 的 Items 发生变化,这不会影响 Button 可见性的绑定(bind)吗? 绑定(bind)使用这个转换器,它也可以工作,但只在我运行应用程序时执行一次。这就是我遇到的问题,它只是不更新​​按钮的可见性,并将其保留在隐藏状态:

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>

最佳答案

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

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

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

关于c# - WPF DataBinding 不更新属性(仅在启动时更新一次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20179939/

相关文章:

c# - 覆盖 .NET 通用列表 <MyType>.Contains(MyTypeInstance)?

c# - for 循环中的每次迭代都会覆盖整个数组的值

c# - DLL导入使用SYSTEMTIME

c# - Entity Framework 中的删除顺序不可预测

c# - 如何创建可重用、上下文无关的 XAML 代码块?

c# - 如果用户在 WPF 中键入任何内容,请检查 PasswordBox

c# - Wpf 按钮条件绑定(bind)到一个变量

c# - 绑定(bind)到 Windows Phone 上 DataTemplate 的元素

wpf - Caliburn Micro,绑定(bind)和通知

c# - 从 ICollectionView CurrentItem 的属性创建 CollectionViewSource