- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在打开时刷新 Silverlight 4 组合框的内容。
这似乎是一件愚蠢而简单的事情,但我终究无法找到直接的答案。
我在 Silverlight 4 应用程序中有一个表单,其中包含一个列出销售订单编号的组合框。许多人会同时打开此表单,因此我希望它在打开时回调到 Web 服务并刷新其内容。
我发现的最接近的是:
http://blogs.msdn.com/b/kylemc/archive/2010/06/18/combobox-sample-for-ria-services.aspx
..我无法完成工作,也无济于事。该示例中没有任何内容允许我在下拉菜单打开时重新填充它。
我正在使用 MVVM 并使用交互类将组合框的打开事件泵入我的 ViewModel。在那里,我调用 web 服务并重置组合框的 ItemsSource 绑定(bind)到的基础属性。不起作用 - 下拉列表闪烁一秒钟,然后打开,但为空。
更新:
XAML:
<ComboBox x:Name="cmbOrderNumber" Width="125"
ItemsSource="{Binding ActiveSalesOrderNumbers, Mode=TwoWay}"
IsEnabled="{Binding OrderSelectorEnabled}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<inf:InvokeDelegateCommandAction Command="{Binding SalesOrderSelectedCommand}" CommandParameter="{Binding ElementName=cmbOrderNumber, Path=SelectedValue}"></inf:InvokeDelegateCommandAction>
</i:EventTrigger>
<i:EventTrigger EventName="DropDownOpened">
<inf:InvokeDelegateCommandAction Command="{Binding SalesOrderOpenedCommand}"></inf:InvokeDelegateCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
C#:
public void OnSalesOrderOpenedCommand(object o)
{
_companyContext.Load(_companyContext.GetSales_Order_Numbers_FromDateQuery(_lastSalesOrderRequest), q =>
{
if (!q.HasError)
{
q.Entities.ToList().ForEach(e =>
{
ActiveSalesOrderNumbers.Add(e.Sales_Order_Number);
});
_lastSalesOrderRequest = DateTime.Now;
}
else
{
throw new Exception("Error updating sales order number list.");
}
}, null);
}
事件被触发,我看到数据按预期从服务返回,并将新项目添加到 ActiveSalesOrderNumbers
,这是一个 ObservableCollection。下拉列表不更新,没有新记录。
最佳答案
您的项目列表是什么样的?如果你的ItemsSource
被绑定(bind)到 ObservableCollection<T>
在您的 ViewModel 上,那么您应该能够从该集合和 ComboBox
中添加/删除项目项目将正确更新。 ComboBox 因一旦设置一次就真的搞砸了你的绑定(bind)而臭名昭着。我建议不要尝试替换整个 ItemsSource,而是使用 ObservableCollection<T>
, Clear()
然后Add(...)
.
我现在正在做一个项目,我已经完成了这件事,所以我可以验证它是否有效。
编辑:
主页.xaml
<ComboBox
x:Name="comboBox"
ItemsSource="{Binding ActiveSalesOrderNumbers}"
HorizontalAlignment="Center"
Width="200"
Height="27"
Margin="30">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel
Orientation="Horizontal">
<TextBlock>
<Run Text="{Binding SalesOrderNumber}"/>
<Run Text="{Binding LastModified}"/>
</TextBlock>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
<i:Interaction.Triggers>
<i:EventTrigger EventName="DropDownOpened">
<ei:CallMethodAction MethodName="OnSalesOrderOpenedCommand" TargetObject="{Binding DataContext, ElementName=comboBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
MainPage.xaml.cs
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.DataContext = new MainPageViewModel();
}
}
MainPageViewModel.cs
public class MainPageViewModel : NotifyObject
{
private readonly SalesOrderRepository _repository;
public MainPageViewModel()
: this(new SalesOrderRepository())
{
}
public MainPageViewModel(SalesOrderRepository repository)
{
_repository = repository;
this.ActiveSalesOrderNumbers = new ObservableCollection<SalesOrder>();
}
private ObservableCollection<SalesOrder> _activeSalesOrderNumbers;
public ObservableCollection<SalesOrder> ActiveSalesOrderNumbers
{
get { return _activeSalesOrderNumbers; }
set
{
_activeSalesOrderNumbers = value;
NotifyPropertyChanged(() => ActiveSalesOrderNumbers);
}
}
public void OnSalesOrderOpenedCommand()
{
_repository.GetSalesOrderNumbers(result =>
{
this.ActiveSalesOrderNumbers.Clear();
result.ToList().ForEach(e => { this.ActiveSalesOrderNumbers.Add(e); });
});
}
}
public class SalesOrder : NotifyObject
{
private string _salesOrderNumber;
public string SalesOrderNumber
{
get { return _salesOrderNumber; }
set
{
_salesOrderNumber = value;
NotifyPropertyChanged(() => SalesOrderNumber);
}
}
private DateTime _lastModified;
public DateTime LastModified
{
get { return _lastModified; }
set
{
_lastModified = value;
NotifyPropertyChanged(() => LastModified);
}
}
}
public class SalesOrderRepository
{
public void GetSalesOrderNumbers(Action<IEnumerable<SalesOrder>> reply)
{
List<SalesOrder> orders = new List<SalesOrder>();
for (int i = 0; i < 10; i++)
{
orders.Add(new SalesOrder { SalesOrderNumber = i.ToString(), LastModified = DateTime.Now });
}
reply(orders);
}
}
通知对象.cs
public abstract class NotifyObject : INotifyPropertyChanged
{
/// <summary>
/// Occurs when a property value changes.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged = delegate { };
/// <summary>
/// Raises this object's PropertyChanged event.
/// </summary>
/// <param name="propertyName">The property that has a new value.</param>
protected void NotifyPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
/// <summary>
/// Raises this object's PropertyChanged event.
/// </summary>
/// <typeparam name="TProperty">The type of the property.</typeparam>
/// <param name="property">The property.</param>
protected void NotifyPropertyChanged<TProperty>(Expression<Func<TProperty>> property)
{
var lambda = (LambdaExpression)property;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else memberExpression = (MemberExpression)lambda.Body;
NotifyPropertyChanged(memberExpression.Member.Name);
}
/// <summary>
/// Warns the developer if this object does not have
/// a public property with the specified name. This
/// method does not exist in a Release build.
/// </summary>
[Conditional("DEBUG")]
public void VerifyPropertyName(string propertyName)
{
// If you raise PropertyChanged and do not specify a property name,
// all properties on the object are considered to be changed by the binding system.
if (String.IsNullOrEmpty(propertyName))
return;
// Verify that the property name matches a real,
// public, instance property on this object.
if (this.GetType().GetProperties().Where(p => p.Name == propertyName).FirstOrDefault() == null)
{
throw new ArgumentException(String.Format("Invalid property name: {0}", propertyName));
}
}
}
关于c# - 银光 4 : How to make a combobox refresh its ItemsSource on open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4830264/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个包含一些数据的网格(用户列表)。对于每一行,我有许多操作,例如更新、删除、激活、暂停、查看您命名的订单。 而不是放置如此多的按钮,这些按钮将填充超过 400-500像素 我想放置一个组合框,其
在我的一个对话框中,我有以下控制: 我在其他地方填充 ComboBox,如下所示: 但是,如果我没有创建 ComboBox 位,MSI 仍将构
我在项目中为 MVC 使用了 kendo complete。 我有某些形式的国家/地区列表,我显示国家/地区名称,但存储国家/地区代码。 我有以下问题:当用户输入不在列表中的内容时,该值将发送到服务器
我有一个组合框,其中的值是从托管 bean 填充的,如下所示: keywordlist.setConnDB("jdbc:sqlserver://xx.xx.x.xx:1433;DatabaseName
我有一个 ComboBox,它绑定(bind)到 ViewModel 中的复杂类型集合,这些类型的长度可以是任意数量,具体取决于用户的偏好。 我已经创建了一个基于 ComboBox 默认值的样式,并且
我做了一个转换器: public class BooleanToDateConverter implements Converter { private static final long s
编辑:由于 Rob 的回答,我已经更新了下面的代码,现在它可以工作了。 我找到了几页显示如何执行此操作的页面( http://www.cmcrossroads.com/content/view/131
我是 PyQT 的新手。 我有兴趣向 tableView 的每一行添加一个组合框。在 PyQT 4 中可能吗? 我知道,在 QT5 中是可能的,但不确定 PyQT。 预先感谢您的帮助。 最佳答案 如果
我对 JavaFX(8)、HBox、ComboBox 和 HGrow 有问题。 HGrow 不能与 ComboBox 结合使用。 (信息:使用 TextField (而不是 ComboBox),它按预
我有一个 XAML UserControl连接到 ImportPresenter View 模型。有四个ComboBox我的 XAML 中的项目: CashActivityTypeBAI CashAc
我将两个组合框绑定(bind)到同一个 listviewcollection。问题是在一个组合框中选择一个值会导致另一个组合框选定项更改为第一个组合框的确切值。它们是耦合的,我希望它们彼此独立。 My
我正在尝试在 extjs 3.4 中的组合框中的选项之间添加一行。我可以添加该行,但不能用我的远程位置的数据填充它。 (如果我删除修改的 tpl 选项,它就会填充)。 这是我的代码。我只需要在“组”字
我被 WIX 安装程序中的组合框和自定义操作困住了。 我有一个包含几个值的组合框(下拉菜单)。当用户从此下拉列表中选择一个值时,我想在屏幕上显示一些文本(对于下拉列表中的每个项目都是唯一的)。 在 .
我有 ComboBox cbx 和一个包含选项卡的 TabPane(选项卡:t)和一个按钮 b1。因此,单击此按钮 b1 时,它会在 TabPane 中添加一个新选项卡 t,并在包含以下内容的 Com
我有两个组合框:水果和饮料。 fruits 具有字符串:“apple”、“orange”、“banana” drinks 具有字符串:“water”、“coffee”、“juice” 如何制作一个新组
我必须监听什么事件,以便在用户从(可编辑的)WPF ComboBox control 中选择一个选项时得到通知? 我是否必须先访问 Items 属性才能收听 Items.CurrentChanged?
我有以下简单的 QML 组合框: import QtQuick 2.0 import QtQuick.Controls 1.4 import si.mikroelektronika 1.0 Item
当我创建组合框时,列表中没有项目。现在,当我单击下拉按钮时,会调用一个函数(通过 postcommand 选项),但是一旦在我的函数中,我不知道如何在组合框的列表框中设置值。 代码如下: #u
我有两个组合框 我使用 LINQ-to-Entities 来填充 cmbGroup 组合框 Dim db as myDataEntity cmbGroup.ItemsSource = db.Mak
我是一名优秀的程序员,十分优秀!