我认为这是一个C#初学者问题,但我似乎无法找到正确的解决方案.
我有一个ClassOne对象,它定义了一个事件.我创建了一个ClassTwo对象,它被认为是一个黑盒子,这意味着我不知道它是否会注册到任何事件.ClassTwo构造函数注册到ClassOne的事件.当ClassTwo对象超出范围时,问题就出现了.垃圾收集器永远不会删除此对象,因为它从未取消注册该事件.
所以我有两个问题:
当ClassTwo对象超出范围时,有没有办法知道?对于一个旧的C++程序员来说,这将是在析构函数中,但是使用C#这不起作用.
有没有一个调试工具可以帮助我找到这样的对象?
以下是重现问题的示例代码:
public partial class MainWindow : Window
{
static public ClassOne classOne = new ClassOne();
public MainWindow()
{
InitializeComponent();
ClassTwo classtwo = new ClassTwo();
}
private void buttonTest_Click(object sender, RoutedEventArgs e)
{
GC.Collect();
}
}
public class ClassOne
{
public ClassOne()
{
Trace.WriteLine(this + " constructor");
}
~ClassOne()
{
Trace.WriteLine(this + " destructor");
}
public delegate void UpdateFunc(object sender, EventArgs args);
public event UpdateFunc OnUpdate;
}
public class ClassTwo
{
public ClassTwo()
{
Trace.WriteLine(this + …Run Code Online (Sandbox Code Playgroud) 我正在尝试将TextBlock绑定到ObservableCollection中的特定元素.这就是我现在所做的:
private ObservableCollection<double> arr = new ObservableCollection<double>();
public ObservableCollection<double> Arr { get { return arr; } set { arr = value; } }
testBox.DataContext = this;
private void Button_Click(object sender, RoutedEventArgs e)
{
Arr[0] += 1.0;
}
[ValueConversion(typeof(ObservableCollection<double>), typeof(String))]
public class myObsCollConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ObservableCollection<double> l = value as ObservableCollection<double>;
if( l == null )
return DependencyProperty.UnsetValue;
int i = int.Parse(parameter.ToString());
return l[i].ToString();
}
public object ConvertBack(object value, …Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题,但是可以将一些示例数据定义为DataContext,以便在DesignView中查看我的DataTemplate吗?
目前,我总是要运行我的应用程序,看看我的更改是否正常.
例如,使用以下代码,DesignView只显示一个空列表框:
<ListBox x:Name="standardLayoutListBox" ItemsSource="{Binding myListboxItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Label Grid.Column="0" Content="{Binding text1}" />
<Label Grid.Column="1" Content="{Binding text2}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud) 为WIX的wxs文件中的组件提供guid的正确语法是什么?
在我找到的大多数样品中
Guid="00AD2D6E-BF8A-4EA8-BE9A-57380DECD0E6"
Run Code Online (Sandbox Code Playgroud)
但是在一些样品中我发现了
Guid="{00AD2D6E-BF8A-4EA8-BE9A-57380DECD0E6}"
Run Code Online (Sandbox Code Playgroud)
我更喜欢第二个版本,因为这是由GuidGen工具直接生成的.但这是对的吗?
因为我想避免异常,我想检查一个类型是否具有无参数构造函数.我怎样才能做到这一点?
我需要这样的东西:
bool HasDefaultConstructor<TT>(TT source)
{
return ???;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我想创建一个与源相同类型的对象,如果它没有默认构造函数,我想使用默认(TT).
我现在拥有的是:
static TT CreateObject<TT>(TT source)
{
try
{
if(!HasDefaultConstructor<TT>(source))
{
return default(TT);
}
return (TT)Activator.CreateInstance(source.GetType());
}
catch(Exception ex)
{
Trace.WriteLine("Exception catched!\r\n" + ex);
}
return default(TT);
}
static bool HasDefaultConstructor<TT>(TT source)
{
ConstructorInfo c = typeof(TT).GetConstructor(new Type[] { });
return c != null;
}
Run Code Online (Sandbox Code Playgroud)
但是检查给了我真实的并且CreateInstance抛出了异常
没有无参数的构造函数
解:
bool HasDefaultConstructor(Type t)
{
return t.GetConstructor(Type.EmptyTypes) != null;
}
Run Code Online (Sandbox Code Playgroud)
有许多递归函数和迭代涉及到这种方式,已经调用了错误的泛型函数HasDefaultConstructor(带有类型对象).使用非泛型函数就可以了.
谢谢大家的建设性帮助.
也许是C#,WPF,.NET 4.0的一个愚蠢的问题:
如果我在窗口派生类上执行新操作并且不在此窗口上调用ShowDialog,则我的程序在关闭时不再关闭.
例:
Window d = new Window();
//d.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我不想显示窗口,我只想将此对象用于某些目的.那么为了让我的程序在之后关闭,我该怎么办呢?
我想在GridView的每一行中都有一个按钮来对该行执行操作.我能够获得点击,但如何确定此按钮属于哪一行?
我现在拥有的是:
<ListView ItemsSource="{Binding Calibrations}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Voltage [kV]" Width="70" DisplayMemberBinding="{Binding Voltage}" />
<GridViewColumn Header="Filter" Width="100" DisplayMemberBinding="{Binding FilterName}" />
<GridViewColumn Header="Calibration Date" Width="100" DisplayMemberBinding="{Binding CalibrationDate}" />
<GridViewColumn Header="Calibration" Width="60">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="Start" Click="OnStart" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
private void OnStart(object sender, RoutedEventArgs e)
{
// how do I know, on which item this button is
}
Run Code Online (Sandbox Code Playgroud)
是否有某种方法可以将此行上的项绑定到RoutedEventArgs?
我知道这是糟糕的设计,但我需要从我的视图模型访问视图。这是因为我有一些旧控件,例如 Winforms 控件,它们不支持绑定,需要通过代码填充。
我正在使用 AvalonDock 2.0 的 MVVM 模型并且有类似的东西:
<ad:DockingManager x:Name="dockManager"
DocumentsSource="{Binding Files}"
AnchorablesSource="{Binding Tools}"
ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}">
<ad:DockingManager.LayoutItemTemplateSelector>
<local:PanesTemplateSelector>
<local:PanesTemplateSelector.NavigationViewTemplate>
<DataTemplate>
<tvext:TreeViewExtended />
</DataTemplate>
</local:PanesTemplateSelector.NavigationViewTemplate>
</local:PanesTemplateSelector>
</ad:DockingManager.LayoutItemTemplateSelector>
Run Code Online (Sandbox Code Playgroud)
因此模板 NavigationViewTemplate 绑定到集合 Tools 的一项,即我的 NavigationViewModel 类型的 ViewModel。
我没有问题,例如将 TextBox 绑定到我的视图模型的属性。但我不知道如何从我的 NavigationViewModel 访问模板内的 tvext:TreeViewExtended 控件以填充它。
蒂亚·迈克尔
VS UnitTest项目中断言的标准行为是告诉我测试在特定行上失败了.
然而有时候,如果我可以在这样的断言失败时打破它会很方便.因为只在该行上设置断点也会导致测试用例失败.如果我能断言断言失败,我可以立即看到哪个测试用例失败了.
当断言失败时,如何暂时告诉VS中断?
例如,我在单元测试中以下列方式有许多循环,并想知道哪个迭代失败:
foreach(var testcase in testcases)
{
Assert.AreEqual(testcase.ExpectedOutputData, FuncionUnderTest(testcase.InputData));
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些数据传递给DataContractSerializer的StreamingContext,但我无法弄清楚如何.以下是我的代码的一小部分示例:
MemoryStream stream = new MemoryStream();
DataContractSerializer serializer = new DataContractSerializer(typeof(OldClass));
serializer.WriteObject(stream, _OldClass);
stream.Seek(0, SeekOrigin.Begin);
serializer = new DataContractSerializer(typeof(NewClass));
//here I would like to give the serializer e.g. a string as StreamingContext.Context
_NewClass = (NewClass)serializer.ReadObject(stream);
Run Code Online (Sandbox Code Playgroud) c# ×6
wpf ×5
.net ×3
xaml ×3
data-binding ×2
binding ×1
constructor ×1
datatemplate ×1
designview ×1
destructor ×1
events ×1
gridview ×1
installer ×1
mvvm ×1
reflection ×1
unit-testing ×1
wix ×1