我在绑定(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;
}
}
这是控件的图像,它可能会帮助您理解我所说的:
以防万一,这是我使用的 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/