更新
经过一番调查.似乎问题是SelectedValue/SelectedItem在Item源完成加载之前发生.如果我坐在断点并等待几秒钟,它会按预期工作.不知道我将如何解决这个问题.
结束更新
我有一个应用程序在WPF中使用MVVM和ComboBox.下面是ViewModel示例.我遇到的问题是当我们离开页面并迁移回ComboBox时没有选择当前选择的值.
查看模型
public class MyViewModel
{
private MyObject _selectedObject;
private Collection<Object2> _objects;
private IModel _model;
public MyViewModel(IModel model)
{
_model = model;
_objects = _model.GetObjects();
}
public Collection<MyObject> Objects
{
get
{
return _objects;
}
private set
{
_objects = value;
}
}
public MyObject SelectedObject
{
get
{
return _selectedObject;
}
set
{
_selectedObject = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了这个例子,我们可以说MyObject有两个属性(Text和Id).我的ComboBox XAML看起来像这样.
XAML
<ComboBox Name="MyComboBox" Height="23" Width="auto"
SelectedItem="{Binding Path=SelectedObject,Mode=TwoWay}"
ItemsSource="{Binding Objects}"
DisplayMemberPath="Text"
SelectedValuePath="Id">
Run Code Online (Sandbox Code Playgroud)
无论我在回到页面时如何配置此对象并重新组装对象,ComboBox都不会选择该值.该对象通过属性中的get返回正确的对象.
我不确定这是否只是ComboBox和MVVM模式工作方式的问题.我们正在进行的文本框绑定正常工作.
我想知道如何在Chrome扩展程序中插入图片.
<img id="image" src="logo.png" />
Run Code Online (Sandbox Code Playgroud)
我正在将html标签正确插入网站,但自然无法加载logo.png图像.
关于如何修改manifest.json的任何想法?
我正在尝试使用以下日志记录程序集配置控制台应用程序:
如果以编程方式配置记录器,那么一切正常:
NameValueCollection properties = new NameValueCollection(); properties["showDateTime"] = "true";
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter(properties);
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用以下配置文件启动它,它会爆炸:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<common>
<logging>
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
<arg key="configType" value="FILE-WATCH"/>
<arg key="configFile" value="~/Log4NET.xml"/>
</factoryAdapter>
</logging>
</common>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这些是相关的错误消息:
{"Unable to cast object of type 'System.Configuration.DefaultSection' to type 'System.Configuration.AppSettingsSection'."}
{"Failed obtaining configuration for Common.Logging from configuration section 'common/logging'."}
Run Code Online (Sandbox Code Playgroud)
它似乎无法解析我的配置文件,是否有人知道正确的格式应该是什么,或者是其他错误的东西?我使用官方文档创建了配置文件.
好的,我一直在与WPF合作,但我需要一些帮助.
我有一个ComboBox如下:
<TabControl>
<TabItem Header="1">
<ComboBox ItemsSource="{Binding MyList}" SelectedItem="{Binding MyListSelection}"/>
</TabItem>
<TabItem Header="2"/>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
每当我离开标签1然后回到它时,选择就会被移除.我认为这样做的原因是控件在超出范围然后重新进入时会被销毁.但是在过程中,SelectedItem变为null,这不是用户想要的,因为UI是一个事件生命周期.
所以我想知道最佳路线是什么?我正在使用MVVM构建这个应用程序,所以我可以忽略我的ViewModel中MyListSelection属性的set调用,但是我在整个地方都有ComboBox,并且不喜欢修改我的ViewModel,因为我认为它是WPF的一个bug.
我可以子类化WPF ComboBox,但是没有SelectedItemChanging事件我只能在SelectedItem更改时添加处理程序.
有任何想法吗?
更新:
好吧,在我的头撞墙后,我发现为什么我的问题无法复制.如果列表项类型由于某种原因是一个类,则由WPF将SelectedItem设置为null,但如果它是值类型则不会.
这是我的测试类(VMBase只是一个实现INotifyPropertyChanged的抽象类):
public class TestListViewModel : VMBase
{
public TestListViewModel()
{
TestList = new List<TestViewModel>();
for (int i = 0; i < 10; i++)
{
TestList.Add(new TestViewModel(i.ToString()));
}
}
public List<TestViewModel> TestList { get; set; }
TestViewModel _SelectedTest;
public TestViewModel SelectedTest
{
get { return _SelectedTest; }
set
{
_SelectedTest = value;
OnPropertyChanged("SelectedTest");
}
}
}
public class …Run Code Online (Sandbox Code Playgroud)