【发布时间】:2015-11-25 13:04:59
【问题描述】:
我创建的自定义事件有问题。我制作了一个如下所示的用户控件:
public partial class UCListView : UserControl {
public UCListView() {
InitializeComponent();
}
public event EventHandler SubmitClick;
public event EventHandler MouseButtonUpEvent;
private void SubmitButton_OnClick(object sender, RoutedEventArgs e) {
if (SubmitClick != null)
SubmitClick(this, e);
}
private void MouseButtonUp(object sender, RoutedEventArgs e) {
if (MouseButtonUpEvent != null) {
MouseButtonUpEvent(this, e);
}
}
}
这是我的 MouseButtonUp 事件。 以下是我收听事件的地方:
public partial class RoundsteelWindow : WindowControls {
private UCListView uc;
public RoundsteelWindow() {
InitializeComponent();
uc = new UCListView();
uc.SubmitClick += new EventHandler(ButtonPressed);
uc.MouseButtonUpEvent += new EventHandler(MousePressed);
stkTest.Children.Add(uc);
base.Test<RoundSteel>(uc, "Roundsteel");
}
}
这里是 WindowControls,其中可以看到 MousePressed 方法。这与此代码下方的代码 sn-p 相同。真的没看到问题:
public abstract class WindowControls : Window {
public IMaterialWith14Elements _ReturnObject { get; set; }
public double amount { get; set; }
private UCListView _uc;
public void Test<T>(UCListView uc, string type) where T: IMaterialWith14Elements, new() {
_uc = uc;
List<T> test = MaterialLogic.GetList(type) as List<T>;
foreach (T material in test) {
uc.listView.Items.Add(material.Name);
}
}
private string str;
public void MousePressed(object sender, EventArgs eventArgs) {
var item = (sender as ListView).SelectedItem;
if (item != null) {
_ReturnObject = _uc.listView.SelectedItems as FlatSteel ;
str = item.ToString();
_uc.amountText.IsEnabled = true;
}
}
public void ButtonPressed(object sender, EventArgs e) {
if (!string.IsNullOrEmpty(_uc.amountText.Text)) {
amount = _uc.amountText.Text.customParseToDouble();
this.Close();
}
else {
MessageBox.Show("Indtast venligst en værdi.");
}
}
}
现在问题如下:使用以下代码它可以工作,但是这个类没有使用窗口控件。它由处理所有按钮的另一个类调用。
private void flatsteelListView_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs e) {
var item = (sender as ListView).SelectedItem;
if (item != null) {
_returnObject = flatsteelListView.SelectedItems as FlatSteel;
str = item.ToString();
amountTextbox.IsEnabled = true;
FindObject(str);
}
}
第一张图片显示了工作窗口。这是没有使用用户控件的地方。实际上,这是我在 stackoverflow Help for thisissue 上处理过并获得帮助的上一个问题。 第二张图片显示了使用已创建的用户控件的下一个窗口。按钮事件起作用并关闭窗口。当按下列表视图项时,问题就来了。它与第一张图片(它工作的地方)做同样的事情,但它给了我一个空引用,这对我来说没有任何意义。我还检查了对象发送者,看看这两个不同窗口的发送者之间是否存在差异。
我只是不明白为什么这不起作用。
你好,达罗菲
【问题讨论】:
-
显然您在 Screenshow 中的发件人不是 ListView 类型。您可以通过分离转换然后检查结果是否为空来检查这一点。
-
我就把this留在这里。
-
很高兴看到
sender是什么,您几乎可以看到它,但您被异常窗口掩盖了。问题是as转换不起作用并返回 null,您需要告诉我们sender是什么时候发生异常。 -
我添加了一张可以看到发件人的图片
标签: c# wpf user-controls window